2012-07-22 16 views
9

Non sembra funzionare:Posso ottenere il valore di una proprietà privata con Reflection?

$ref = new ReflectionObject($obj); 

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

Si entra nel ciclo IF, e quindi genera un errore:

Property privateProperty does not exist

: |

$ref = new ReflectionProperty($obj, 'privateProperty') non funziona neanche ...

I documentation page liste alcune costanti, tra cui IS_PRIVATE. Come posso usarlo se non riesco ad accedere a una proprietà privata lol?

+0

Perché avete bisogno di questo? – zerkms

+1

IS_PRIVATE e le altre costanti sono applicabili per il metodo getProperties (plurale - non getProperty) –

risposta

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

il tuo esempio sembra funzionare, ma il mio non lo fa :(Potrebbe essere perché la mia classe è una classe figlia? – Alex

+0

@Alex: vedere il C'è sicuramente qualcosa che ti sei perso – zerkms

+0

@Alex: sì, 'private' visibile solo alle classi in cui sono stati creati. Ma in questo caso' hasProperty' restituire 'false' – zerkms

1

getProperty genera un'eccezione, non un errore. Il significato è, si può gestire, e risparmiare 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(); 
} 

Per ottenere tutte le proprietà private, utilizzare $ref->getProperties(IS_PRIVATE);

+0

head up, 'IS_PRIVATE' dovrebbe essere 'ReflectionProperty :: IS_PRIVATE' –

Problemi correlati