属性,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 中访问它,而无需 public
。 private
表示只有基础 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();
我有以下两个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 中访问它,而无需 public
。 private
表示只有基础 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();