2012-07-22 10 views
9

No parece trabajar:¿Puedo obtener el valor de una propiedad privada con Reflection?

$ref = new ReflectionObject($obj); 

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

Se pone en el circuito de IF, y luego emite un error:

Property privateProperty does not exist

: |

$ref = new ReflectionProperty($obj, 'privateProperty') tampoco funciona ...

Las listas documentation page unas pocas constantes, incluyendo IS_PRIVATE. ¿Cómo puedo usar eso si no puedo acceder a una propiedad privada jajaja?

+0

¿Por qué necesita eso? – zerkms

+1

Las constantes IS_PRIVATE y othe son aplicables para el método getProperties (plural - not getProperty) –

Respuesta

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

Parece que su ejemplo funciona, pero el mío no :(¿Podría ser porque mi clase es una clase secundaria? – Alex

+0

@Alex: vea el diferencia entre ellos. Definitivamente hay algo que te has perdido – zerkms

+0

@Alex: sí, 'private' solo visible para las clases en las que fueron creados. Pero en ese caso' hasProperty' devolvería 'false' – zerkms

1

getProperty arroja una excepción, no es un error. El significado es, puede manejarlo, y se ahorrará un 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(); 
} 

Para obtener todas las propiedades privadas, utilizar $ref->getProperties(IS_PRIVATE);

+0

cabeza arriba, 'IS_PRIVATE' debería be 'ReflectionProperty :: IS_PRIVATE' –

Cuestiones relacionadas