30

うまくいかないようです:

$ref = new ReflectionObject($obj);

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

IF ループに入り、エラーをスローします。

プロパティ privateProperty が存在しません

:|

$ref = new ReflectionProperty($obj, 'privateProperty')どちらも機能しません...

ドキュメントページには、 を含むいくつかの定数がリストされていますIS_PRIVATE。私有地にアクセスできない場合、どうすればそれを使用できますか?

4

4 に答える 4

60
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));
于 2012-07-22T23:54:44.057 に答える
2

親クラスから取得したプライベート プロパティの値を取得する必要がある場合、受け入れられた回答は機能しないことに注意してください。

これには、Reflection API の getParentClass メソッドを利用できます。

また、これはこのマイクロライブラリですでに解決されています。

詳細については、このブログ投稿を参照してください。

于 2021-02-14T16:01:49.983 に答える
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(ReflectionProperty::IS_PRIVATE);

于 2012-07-23T00:04:17.003 に答える