在此示例中,我认为从getVars
调用的函数data
将能够返回B
的私有变量名,因为$this
是{{1}的实例}}
而不是它,B
返回一个空数组。
$this->getVars()
调用私有变量是不是可见?get_object_vars
一个方法继承到getVars
并且被调用就好像是在其中声明的那样?示例:
B
答案 0 :(得分:3)
私有属性仅适用于该类的方法。尝试使用受保护的属性来确保继承的方法可以访问它们。
可以通过在声明前加上关键字public,protected或private来定义属性或方法的可见性。声明为public的类成员可以随处访问。声明受保护的成员只能在类本身和继承的类中访问。声明为private的成员只能由定义该成员的类访问。
答案 1 :(得分:1)
是的,因为get_object_vars
对范围敏感。如果您不想更改变量的可见性,请直接从函数get_object_vars
调用data()
。
如果要保持代码继承不变,则必须将变量的可见性更改为受保护。
abstract class A
{
public function getVars()
{
return get_object_vars($this);
}
}
class B extends A
{
protected $a;
protected $b;
protected $c;
public function data()
{
return $this->getVars();
}
}
$a = new B();
print_r($a->data());