class Configurable
{
protected function configure(array $config): void
{
foreach ($config as $key => $value){
if (property_exists($this, $key)){
$this->{$key} = $value;
}
}
}
}
class C extends Configurable
{
private $abc;
public function __construct()
{
$this->configure(['abc' => 5]);
}
}
$c = new C();
此代码给我错误Cannot access private property C::$abc
当parent
类中的私有变量很明显时,但是在此代码中,私有变量在子类中,而property_exists
看到了该变量。我在php文档中找不到解释。
我的困惑如下。
父方法继承于子方法。我的假设是此方法应该可以访问child中的变量,但没有访问权限。 property_exists
知道此属性,但无法设置。
答案 0 :(得分:0)
使用protected
$ abc` visibility 的原因是您在同一类中使用父方法(configure()),因此在父类中abc变量不能是private的访问原因
class Configurable
{
protected function configure(array $config): void
{
foreach ($config as $key => $value){
if (property_exists($this, $key)){
$this->{$key} = $value;
}
}
}
}
class C extends Configurable
{
protected $abc;
public function __construct()
{
$this->configure(['abc' => 5]);
}
//this method is when you're trying to access $c->abc that'll return from here.
public function __get($method)
{
return $this->$method;
}
}
$c = new C();
echo $c->abc;
如果要使用 Private 定义变量,则可以在同一类中定义configure()方法。和 __ get 方法是用于当您尝试访问受保护的和 private 变量时,此__get()函数将被调用。
class Configurable
{
protected function configure(array $config): void
{
foreach ($config as $key => $value){
if (property_exists($this, $key)){
$this->{$key} = $value;
}
}
}
}
class C extends Configurable
{
private $abc;
public function __construct()
{
$this->configure(['abc' => 5]);
}
//method overriding
protected function configure(array $config): void
{
foreach ($config as $key => $value){
if (property_exists($this, $key)){
$this->{$key} = $value;
}
}
}
public function __get($method)
{
return $this->$method;
}
}
$c = new C();
echo $c->abc;