2012-07-22 6 views
9

動作していないよう:Reflectionでプライベートプロパティの値を取得できますか?

Property privateProperty does not exist

それはその後、IFループに取得し、
$ref = new ReflectionObject($obj); 

if($ref->hasProperty('privateProperty')){ 
    print_r($ref->getProperty('privateProperty')); 
} 

でエラーが発生します|

$ref = new ReflectionProperty($obj, 'privateProperty')

は...どちらか IS_PRIVATE含む

documentation pageリストいくつかの定数を、動作しません。私が私有財産LOLにアクセスできない場合、どうすればそれを使うことができますか?

+0

を使うのか? – zerkms

+1

IS_PRIVATEとその他の定数は、getProperties(複数の - getPropertyではない)メソッド –

答えて

26
class A 
{ 
    private $b = 'c'; 
} 

$obj = new A(); 

$r = new ReflectionObject($obj); 
$p = $r->getProperty('b'); 
$p->setAccessible(true); // <--- you set the property to public before you read the value 

var_dump($p->getValue($obj)); 
+0

に適用されますが、私のクラスは子クラスである可能性がありますか? – Alex

+0

@Alex:あなたが見逃してしまったことは間違いありません。 – zerkms

+0

@Alex:うまくいけば、 'private'は作成されたクラスにしか見えませんが、' hasProperty'は 'false'を返します – zerkms

1

getPropertyが例外をスローしますが、エラーは発生しません。重要性は、あなたがそれを処理し、そして自分自身ifを保存することができ、次のとおりです。

$ref = new ReflectionObject($obj); 
$propName = "myProperty"; 
try { 
    $prop = $ref->getProperty($propName); 
} catch (ReflectionException $ex) { 
    echo "property $propName does not exist"; 
    //or echo the exception message: echo $ex->getMessage(); 
} 

すべてのプライベートプロパティを取得するには、あなたがそれを必要としないのはなぜ$ref->getProperties(IS_PRIVATE);

+0

頭が上がり、 'IS_PRIVATE'がshould 'ReflectionProperty :: IS_PRIVATE'である –

関連する問題