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


Kann ich mit Reflection den Wert einer Privatimmobilie ermitteln
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:

$object = new SomeObject();
$reader = $this->propertyReader();
$result = &$reader($object, 'some_property');

Bitte beachten Sie, dass die akzeptierte Antwort nicht funktioniert, wenn Sie den Wert eines Privateigentums ermitteln müssen stammt aus einer Elternklasse.

Darauf können Sie sich verlassen getParentClass-Methode der Reflection-API.

Auch das ist bereits gelöst diese Mikrobibliothek.

Näheres in diesen Blogbeitrag.

.

594150cookie-checkKann ich mit Reflection den Wert einer Privatimmobilie ermitteln?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy