使用ReflectionClass的受保护的变量

问题描述:

我试图通过调用类读取受保护的变量。问题与我的受保护的$测试和新的ReflectionClass在哪里?使用ReflectionClass的受保护的变量

<?PHP 
class foo 
{ 
    protected $test = ['foo' => 'foo']; 
    public function __construct() 
    { 
     $class = get_called_class(); 

     do 
     { 
      foreach((new \ReflectionClass($class))->getDefaultProperties() as $property => $value) 
       var_dump([$class.'::'.$property => $value]); 
     } 
     while($class = get_parent_class($class)); 
    } 
} 

class baz extends foo 
{ 
    protected $test = ['baz' => 'baz']; 
} 

new baz; 

实际:

["baz::test"]=> 
    ["baz"]=> "baz" 
    ["foo::test"]=> 
    ["baz"]=> "baz" 

预期:

["baz::test"]=> 
    ["baz"]=> "baz" 
    ["foo::test"]=> 
    ["foo"]=> "foo" 

亲切的问候。

没有问题。在父类中的$test类变量设置为:

array 
(
    'foo' => 'foo' 
) 

和承接其覆盖数组的值(它不添加到数组,但替换所有现有的键/值的子类)与:

array 
(
    'baz' => 'baz' 
) 
+0

即使我创建ReflectionClass(字符串parentClassName)的新实例 - 不是由巴兹的实例吗? 我如何使用ReflectionClass检测父母? – fruffl

+0

是的。如PHP手册中所定义的,继承意味着“扩展或派生类具有基类的所有变量和函数”。你在巴兹做的所有事情都是压倒一个变量。 – hohner

+0

@fruffl你对这个问题感到满意还是你想更多地讨论它?如果没有,你可以标记这个答案为接受:) – hohner