在另一个OOP PHP中使用一个类的属性

时间:2015-02-14 03:41:52

标签: php oop

我有以下课程

namespace PG\Referrer\Single\Post;

class Referrer implements ReferrerInterface
{
    /**
     * @var $authorReferrer = null
     */
    protected $isAuthorReferrer = null;

    /**
     * @var $dateReferrer = null
     */
    protected $isDateReferrer = null;

    /**
     * @var $searchReferrer = null
     */
    protected $isSearchReferrer = null;

    /**
     * @var $taxReferrer = null
     */
    protected $isTaxReferrer = null;

    /**
     * @param array $values = null;
     */
     public function __construct(array $values = null)
    {
        if ($values)
        $this->setBulk($values);
    }

    /**
     * Bulk setter Let you set the variables via array or object
     */
    public function setBulk($values)
    {

        if (!is_array($values) && !$values instanceof \stdClass) {
            throw new \InvalidArgumentException(
                sprintf(
                    '%s needs either an array, or an instance of \\stdClass to be passed, instead saw %s',
                    __METHOD__,
                    is_object($values) ? get_class($values) : gettype($values)
                )
            );
        }

        foreach ($values as $name => $value) {//create setter from $name
            global $wp_query;

            if (array_key_exists($value, $wp_query->query_vars)) { //Check that user don't set a reserved query vars
                throw new \InvalidArgumentException(
                    sprintf(
                        '%s is a reserved query_vars and cannot be used. Please use a unique value',
                        $value
                    )
                );
            }

            $setter     = 'set' . $name;
            $condition  = isset($_GET[$value]);

            if ($setter !== 'setBulk' && method_exists($this, $setter)) {
                $this->{$setter}($condition);//set value (bool)
            }
        }
        return $this;
    }

    /**
     * @param bool $authorReferrer
     * @return $this
     */
    public function setAuthorReferrer($isAuthorReferrer)
    {
        $this->isAuthorReferrer = $isAuthorReferrer;
        return $this;
    }

    /**
     * @param bool $dateReferrer
     * @return $this
     */
    public function setDateReferrer($isDateReferrer)
    {
        $this->isDateReferrer = $isDateReferrer;
        return $this;
    }
    /**
     * @param bool $searchReferrer
     * @return $this
     */
    public function isSearchReferrer($isSearchReferrer)
    {
        $this->isSearchReferrer = $isSearchReferrer;
        return $this;
    }

    /**
     * @param bool $taxReferrer
     * @return $this
     */
    public function setTaxReferrer($isTaxReferrer)
    {
        $this->isTaxReferrer = $isTaxReferrer;
        return $this;
    }

}

及其界面

namespace PG\Referrer\Single\Post;

interface ReferrerInterface
{
    /**
     * @param array $values
     * @return $this
     */
    public function setBulk($values);
    /**
     * @param bool $authorReferrer
     * @return $this
     */
    public function setAuthorReferrer($isAuthorReferrer);
    /**
     * @param bool $dateReferrer
     * @return $this
     */
    public function setDateReferrer($isDateReferrer);
    /**
     * @param bool $searchReferrer
     * @return $this
     */
    public function isSearchReferrer($isSearchReferrer);
    /**
     * @param bool $taxReferrer
     * @return $this
     */
    public function setTaxReferrer($isTaxReferrer);

}

这个类设置了我需要在另一个类中使用的4个条件。此类中使用的值也是从另一个类设置的,所以基本上用户设置另一个类中的值(让我们称之为类b)然后由类Referrer使用并返回4个条件,然后由b级。

我这样做的原因是因为会有另外两个类需要做同样的事情,但会返回不同的信息

实现这一目标的更正确方法是什么?

修改

要清除这一点

类推荐人

属性$isAuthorReferrer$isDateReferrer等将具有值null或布尔值,具体取决于用户设置的值。

示例:

$q = new Referrer(['authorReferrer' => 'aq']);

在上面的代码中,当变量$isAuthorReferrer在URL中可用时,setBulk()通过类中的aq方法设置为true,如果不存在,则设置为false。其他三个属性将返回null,因为它们未在示例中设置。

以上内容按预期工作,但我需要在另一个类中执行此操作,再次调用它class b。参数将设置为类b,反过来,类b将此参数设置为类Referrer,类Referrer将使用此参数并返回其属性的正确值,类b将使用此结果执行其他操作< / p>

示例:

$q = new b(['authorReferrer' => 'aq']);

哪个类b可能是这样的(这部分我不知道如何编码)

class b implements bInterface
{
    protected $w;
    protected $other;

    public function __construct($args = [])
    {
        //Do something here
        // Do something here so that we can use $other in other classes or functions
    }

    public function a()
    {
        $w = new Referrer($args);
    }

    public function b()
    {
        // use $w properties here
       // return $other for usage in other classes and functions
    }
}

1 个答案:

答案 0 :(得分:2)

最好的方法是将引荐者注入您的课程,以便在他们和引荐来源之间loose coupling(此模式使用您的ReferrerInterface的好处):

class b implements bInterface
{
    protected $referrer;

    public function __construct(ReferrerInterface $referrer, array $values = array())
    {
        $this->referrer = $referrer;
        $this->referrer->setBulk($values);
    }

    public function getReferrer()
    {
        return $this->referrer;
    }

    public function b()
    {
        // use $this->referrer properties here
    }
}

// Instantiation (use your dependency injection if you have one):
$referrer = new Referrer();
$b = new b($referrer, ['authorReferrer' => 'aq']);

我不明白什么是$other所以我删除了它但是如果你想让我再添加它就解释一下。

如果您需要在b中使用引荐来源者的属性,则应在ReferrerInterface中添加一些getter以允许这样做。我会使用setAuthorReferrer($isAuthorReferrer)来设置值,并使用isAuthorReferrer()来获取它。