我有以下两个类(我没有包含接口)
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错误
答案 0 :(得分:1)
使用protected
,您的子课程可以使用它。通过这种方式,您仍可以在子类中访问它,而无需使用public
。 private
表示只有基类可以使用它。
另外,作为旁注,没有默认值的类中的所有变量都将默认为null
/**
* @var $authorReferrer = null
*/
protected $isAuthorReferrer;
答案 1 :(得分:1)
解决此问题。我还是OOP的新手,并且对定位器和吸气器有轻微的误解。
我所做的是,我为 ConditionsRefer 类中的每个setter创建了一个getter,而不是尝试在 QueryArgumentsRefer 类中使用此类的属性(这导致了初始错误),我使用getter从 QueryArgumentsRefer 类中的 ConditionsRefer 类中获取我的信息,如
$this->conditionalReferrer->isAuthorReferrer();