2012-03-23 20 views
5

Me gustaría tener una propiedad privada en una clase y poder establecerla con otra a través de ReflectionClass.¿ReflectionProperty :: setAccessible hace que la propiedad sea accesible para siempre?

Sé que si creo ReflectionProperties de las propiedades de la clase, puedo configurarlas para que sean accesibles, y luego establecer sus valores.

Sin embargo, si configuro la propiedad como accesible, ¿está accesible en todas partes (como una propiedad pública) o solo en el contexto de ReflectionProperty?

+1

¿Qué está tratando de lograr? Si tiene una propiedad privada que necesita establecer en otro lugar, ¿por qué no simplemente proporcionarle un organismo público? – liquorvicar

+0

Esto podría ser útil al escribir pruebas .. – Weston

+0

@liquorvicar No es para una propiedad privada típica: debe establecerse por una sola cosa, en un lugar determinado solamente, y puede suceder después de la construcción. El comentario de Weston se aplica también. – johnnietheblack

Respuesta

9

Solo se podrá acceder a través de ReflectionProperty::getValue() y ReflectionProperty::setValue(), por lo que no se modificará la visibilidad de la clase original y todas sus instancias.

Ejemplo:

<?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 
    ?> 
Cuestiones relacionadas