2013-01-17 60 views
0

我試圖通過調用類讀取受保護的變量。問題與我的受保護的$測試和新的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" 

親切的問候。

回答

0

沒有問題。在父類中的$test類變量設置爲:

array 
(
    'foo' => 'foo' 
) 

和承接其覆蓋數組的值(它不添加到數組,但替換所有現有的鍵/值的子類)與:

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

即使我創建ReflectionClass(字符串parentClassName)的新實例 - 不是由巴茲的實例嗎? 我如何使用ReflectionClass檢測父母? – fruffl

+0

是的。如PHP手冊中所定義的,繼承意味着「擴展或派生類具有基類的所有變量和函數」。你在巴茲做的所有事情都是壓倒一個變量。 – hohner

+0

@fruffl你對這個問題感到滿意還是你想更多地討論它?如果沒有,你可以標記這個答案爲接受:) – hohner