属性,public 或私有 OOP PHP

Properties, public or private OOP PHP

我有以下两个classes(我没有包括接口

条件参考

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()在classQueryArgumentsRefer中,我需要使用classConditionsRefer.

的属性

这是 $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
}

如果我尝试使用 $test->isAuthorReferrer,我会收到以下错误

Fatal error: Cannot access private property PG\Referrer\Single\Post\ConditionsRefer::$isAuthorReferrer

我猜这是意料之中的。在我看来,实现此功能的唯一方法是将 ConditionsRefer 中的属性设置为 public

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

编辑

我已经尝试将我的属性设置为 protected,但这并没有帮助,因为这也会给我一个致命错误

使用 protected 并且您的 child class 可以使用它。这样,您仍然可以在 children classes 中访问它,而无需 publicprivate 表示只有基础 class 可以使用它。

此外,作为旁注,class 中没有默认值的所有变量将默认为 null

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

解决这个问题。我还是 OOP 的新手,对 setters 和 getter.

有一点误解

我所做的是,我为 ConditionsRefer class 中的每个 setter 创建了一个 getter,而不是尝试使用QueryArgumentsRefer class 中这个 class 的属性(导致初始错误),我使用 getters 从ConditionsRefer class里面的QueryArgumentsReferclass喜欢

$this->conditionalReferrer->isAuthorReferrer();