2012-03-28 7 views

答えて

9

私はこのクイックテストを完了しました。子クラスのプロパティを取得すると、親のプライベートプロパティが隠されているように見えます。ただし、getParentClass()を呼び出すと、getProperties()が表示されます。欠落しているプラ​​イベート・プロップがあります。

<?php 
class Ford { 
    private $model; 
    protected $foo; 
    public $bar; 
} 

class Car extends Ford { 
    private $year; 
} 

$class = new ReflectionClass('Car'); 
var_dump($class->getProperties()); // First chunk of output 
var_dump($class->getParentClass()->getProperties()); // Second chunk 

出力(プライベート小道具Ford::modelが欠落している注意してください):

array(3) { 
    [0]=> 
    &object(ReflectionProperty)#2 (2) { 
    ["name"]=> 
    string(4) "year" 
    ["class"]=> 
    string(3) "Car" 
    } 
    [1]=> 
    &object(ReflectionProperty)#3 (2) { 
    ["name"]=> 
    string(3) "foo" 
    ["class"]=> 
    string(4) "Ford" 
    } 
    [2]=> 
    &object(ReflectionProperty)#4 (2) { 
    ["name"]=> 
    string(3) "bar" 
    ["class"]=> 
    string(4) "Ford" 
    } 
} 

セカンドチャンク(フォードクラスのすべてのプロパティを含む):

array(3) { 
    [0]=> 
    &object(ReflectionProperty)#3 (2) { 
    ["name"]=> 
    string(5) "model" 
    ["class"]=> 
    string(4) "Ford" 
    } 
    [1]=> 
    &object(ReflectionProperty)#2 (2) { 
    ["name"]=> 
    string(3) "foo" 
    ["class"]=> 
    string(4) "Ford" 
    } 
    [2]=> 
    &object(ReflectionProperty)#5 (2) { 
    ["name"]=> 
    string(3) "bar" 
    ["class"]=> 
    string(4) "Ford" 
    } 
} 
+0

Gnarly!ありがとう!あなたが$ class-> getParentClass() - > getProperty( 'model') - > setValue($ car、 'F-150')を実行できるかどうか、 – johnnietheblack

0

私はあなたが」勝ったと思います子クラスがアクセスできないので親のプライベートプロパティを取得しない

2

succ受け入れられた答えは、多くの祖先を持つ子クラスの可能性を無視しています。これは私がこれを達成するために使用するインスタンスメソッドです:

public function getProperties() { 
    $properties = array(); 
    try { 
     $rc = new \ReflectionClass($this); 
     do { 
      $rp = array(); 
      /* @var $p \ReflectionProperty */ 
      foreach ($rc->getProperties() as $p) { 
       $p->setAccessible(true); 
       $rp[$p->getName()] = $p->getValue($this); 
      } 
      $properties = array_merge($rp, $properties); 
     } while ($rc = $rc->getParentClass()); 
    } catch (\ReflectionException $e) { } 
    return $properties; 
} 

それがルートクラスに到達するまで(およびデフォルトの場合にはその子の特性とそれぞれの親のプロパティをマージしながら、それは、階層を横断します階層の最下部で見つかったデフォルトのみを使用します)。

関連する問題