Kann ich mit Reflection den Wert einer Privatimmobilie ermitteln?
Lesezeit: 2 Minuten
Es scheint nicht zu funktionieren:
$ref = new ReflectionObject($obj);
if($ref->hasProperty('privateProperty')){
print_r($ref->getProperty('privateProperty'));
}
Es gelangt in die IF-Schleife und gibt dann einen Fehler aus:
Eigenschaft privateProperty existiert nicht
😐
$ref = new ReflectionProperty($obj, 'privateProperty') geht auch nicht…
Der Dokumentationsseite listet einige Konstanten auf, darunter IS_PRIVATE. Wie kann ich das jemals benutzen, wenn ich keinen Zugang zu einem Privateigentum habe, lol?
Die IS_PRIVATE- und die anderen Konstanten gelten für die Methode getProperties (Plural – nicht getProperty).
– Reisender Techniker
22. Juli 12 um 23:57 Uhr
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));
Ihr Beispiel scheint zu funktionieren, aber meines nicht 🙁 Könnte es daran liegen, dass meine Klasse eine untergeordnete Klasse ist?
– Alex
22. Juli 2012 um 23:58 Uhr
@Alex: Sehen Sie den Unterschied zwischen ihnen. Es gibt definitiv etwas, das Sie verpasst haben
– zerkms
22. Juli 12 um 23:59 Uhr
@Alex: Ja, private nur für Klassen sichtbar, in denen sie erstellt wurden. Aber in diesem Fall hasProperty würden zurückkehren false
– zerkms
22. Juli 12 um 23:59 Uhr
Das ist es codepad.org/lx8ecZMz ..Gibt es eine Möglichkeit, untergeordnete Klasseneigenschaften zu erhalten?
– Alex
23. Juli 12 um 0:01 Uhr
Ich verstehe, dass die Frage sehr alt ist, aber ich habe gerade einige Zeit damit verschwendet, nach einem Weg zu suchen, wie man auf den privaten Eigentumswert eines Elternteils vom Kind zugreifen kann, und solche unvollständigen Antworten zu lesen, und ich hoffe, es würde jemandem Zeit sparen: $p = $r->getParentClass()->getProperty('b');
– AlexandrX
28. Mai 17 um 5:11 Uhr
Reisender Techniker
getProperty löst eine Ausnahme aus, keinen Fehler. Die Bedeutung ist, Sie können damit umgehen und sparen sich eine 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();
}
Um alle privaten Eigenschaften abzurufen, verwenden Sie $ref->getProperties(ReflectionProperty::IS_PRIVATE);
Kopf hoch, IS_PRIVATE sollte sein ReflectionProperty::IS_PRIVATE
– Nicola Pedretti
24. Januar 18 um 23:03 Uhr
Falls Sie es brauchen ohne Betrachtung:
public function propertyReader(): Closure
{
return function &($object, $property) {
$value = &Closure::bind(function &() use ($property) {
return $this->$property;
}, $object, $object)->__invoke();
return $value;
};
}
und verwenden Sie es dann einfach (in derselben Klasse) wie folgt:
Bitte beachten Sie, dass die akzeptierte Antwort nicht funktioniert, wenn Sie den Wert eines Privateigentums ermitteln müssen stammt aus einer Elternklasse.
Die IS_PRIVATE- und die anderen Konstanten gelten für die Methode getProperties (Plural – nicht getProperty).
– Reisender Techniker
22. Juli 12 um 23:57 Uhr