2012-03-23 9 views
5

私はクラス内にプライベートプロパティを持ち、それをReflectionClass経由で別のクラスに設定したいと考えています。ReflectionProperty :: setAccessibleはプロパティを永久にアクセス可能にしますか?

クラスのプロパティのReflectionPropertiesを作成すると、アクセス可能に設定してから値を設定できることがわかりました。

ただし、プロパティをアクセス可能に設定すると、パブリックプロパティのようにどこにでもアクセスできるようになりますか、それともReflectionPropertyのコンテキスト内にありますか?

+1

は何を達成しようとしていますか?あなたがプライベートプロパティを持っている場合は、別の場所に設定する必要があります。なぜパブリックセッターを提供するだけではないのですか? – liquorvicar

+0

これはテストを書くときに便利です。 – Weston

+0

@liquorvicarこれは典型的な私有財産ではなく、ある場所でのみ設定され、建設後に起こることがあります。ウェストンのコメントも適用されます。 – johnnietheblack

答えて

9

ReflectionProperty::getValue()ReflectionProperty::setValue()からしかアクセスできないため、元のクラスとそのすべてのインスタンスは可視性が変更されません。

例:

<?php 

    class MyClass { 
     public function __construct() { $this->priv = 42; } 
     private $priv; 
    } 

    $a = new MyClass(); 

    $ref = new ReflectionClass("MyClass"); 

    $prop = $ref->getProperty("priv"); 
    $prop->setAccessible(TRUE); 

    echo "priv: " . $prop->getValue($a) . "\n"; // OK! 

    echo $a->priv;        // <-- error 
    ?> 
関連する問題