属性,公共或私有OOP PHP

时间:2015-02-15 03:44:42

标签: php oop

我有以下两个类(我没有包含接口

ConditionsRefer

namespace PG\Referrer\Single\Post;

class ConditionsRefer implements ConditionsReferInterface
{
    /**
     * @var $authorReferrer = null
     */
    private $isAuthorReferrer = null;

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

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

    /**
     * @var $taxReferrer = null
     */
    private $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)
    {
        global $wp_query;

        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

            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 $authorReferrer
     * @return $this
     */
    public function setAuthorReferrer($isAuthorReferrer)
    {
        $this->isAuthorReferrer = $isAuthorReferrer;
        return $this;
    }

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

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

}

QueryArgumentsRefer

namespace PG\Referrer\Single\Post;

class QueryArgumentsRefer implements QueryArgumentsReferInterface
{
    private $referrer;

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

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

    }

    public function b()
    {
        $test = (object) $this->referrer;
        if($test->isAuthorReferrer === false)
            return 'This is just a test';
    }
}

这就是我在文件中使用它的方式

$a = new QueryArgumentsRefer(new ConditionsRefer(), ['authorReferrer' => 'aq']);
    ?><pre><?php var_dump($a->b()); ?></pre><?php   

在班级function b()的{​​{1}}中,我需要使用班级QueryArgumentsRefer的属性。

这是ConditionsRefer的结果,这是预期的结果,所以这是有用的

$test

如果我尝试使用object(PG\Referrer\Single\Post\ConditionsRefer)#522 (4) { ["isAuthorReferrer":"PG\Referrer\Single\Post\ConditionsRefer":private]=> bool(false) ["isDateReferrer":"PG\Referrer\Single\Post\ConditionsRefer":private]=> NULL ["isSearchReferrer":"PG\Referrer\Single\Post\ConditionsRefer":private]=> NULL ["isTaxReferrer":"PG\Referrer\Single\Post\ConditionsRefer":private]=> NULL } ,我会收到以下错误

  

致命错误:无法访问私有媒体资源PG \ Referrer \ Single \ Post \ ConditionsRefer :: $ isAuthorReferrer

这是我猜的。让我在脑海中工作的唯一方法是将$test->isAuthorReferrer中的属性设置为ConditionsRefer

我读过的属性应该是public,而不是private。如何正确解决此问题,或者必须制作我的属性public

修改

我已经尝试将我的属性设置为public,但这确实有帮助,因为这也给了我一个fatala错误

2 个答案:

答案 0 :(得分:1)

使用protected,您的子课程可以使用它。通过这种方式,您仍可以在子类中访问它,而无需使用publicprivate表示只有基类可以使用它。

另外,作为旁注,没有默认值的类中的所有变量都将默认为null

/**
 * @var $authorReferrer = null
 */
protected $isAuthorReferrer;

答案 1 :(得分:1)

解决此问题。我还是OOP的新手,并且对定位器和吸气器有轻微的误解。

我所做的是,我为 ConditionsRefer 类中的每个setter创建了一个getter,而不是尝试在 QueryArgumentsRefer 类中使用此类的属性(这导致了初始错误),我使用getter从 QueryArgumentsRefer 类中的 ConditionsRefer 类中获取我的信息,如

$this->conditionalReferrer->isAuthorReferrer();