2012-07-22 7 views
9

Nie wydaje się działać:Czy mogę uzyskać wartość własności prywatnej z Reflection?

$ref = new ReflectionObject($obj); 

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

Robi do pętli IF, a następnie wyrzuca błąd:

Property privateProperty does not exist

: |

$ref = new ReflectionProperty($obj, 'privateProperty') nie działa albo ...

The documentation page list kilka stałe, w tym IS_PRIVATE. Jak mogę tego użyć, jeśli nie mogę uzyskać dostępu do prywatnej własności?

+0

Dlaczego trzeba, że? – zerkms

+1

IS_PRIVATE i inne stałe mają zastosowanie dla metody getProperties (liczba mnoga - nie getProperty). –

Odpowiedz

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

Twój przykład wydaje się działać, ale mój nie działa :(Czy to możliwe, ponieważ moja klasa jest klasą podrzędną? – Alex

+0

@Alex: zobacz Różnica między nimi Jest zdecydowanie coś, co przegapiłeś – zerkms

+0

@Alex: yep, 'private' widoczne tylko dla klas, w których zostały stworzone. Ale w takim przypadku' hasProperty' zwróci 'false' – zerkms

1

getProperty zgłasza wyjątek, a nie błąd. Znaczenie jest, można go obsługiwać i zapisywać własne 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(); 
} 

Aby uzyskać wszystkie właściwości prywatnych, należy $ref->getProperties(IS_PRIVATE);

+0

head up, 'IS_PRIVATE' powinien być 'ReflectionProperty :: IS_PRIVATE' –

Powiązane problemy