Überprüfen Sie, ob eine Eigenschaft für magisch festgelegte Eigenschaften vorhanden ist

Es gibt eine Menge SO Fragen zu diesem Thema, insbesonderedieses, aber es hilft mir nicht.

Es besteht eine Mehrdeutigkeit zwischenproperty_exists undisset Bevor ich meine Frage stelle, möchte ich darauf hinweisen:

property_exists

property_exists prüft, ob ein Objekt eine Eigenschaft enthält, ohne auf ihren Wert zu achten, sondern nur auf ihren WertSichtweite.

Also im folgenden Beispiel:

<?php

class testA
{
  private $a = null;
}
class testB extends testA
{
}

$test = new testA();
echo var_dump(property_exists($test, 'a')); // true

// parent's private property becomes invisible for its child

$test = new testB();
echo var_dump(property_exists($test, 'a')); // false
isset

isset prüft, ob ein Wert in einer Eigenschaft vorhanden ist, wobei berücksichtigt wird, dass dieser nicht gesetzt ist, wenn ein Wert gleich istfalse und null.

<?php

$var = null;
echo var_dump(isset($var)); // false

$var = '';
echo var_dump(isset($var)); // true

$var = false;
echo var_dump(isset($var)); // true

$var = 0;
echo var_dump(isset($var)); // true

$var = '0';
echo var_dump(isset($var)); // true
isset undproperty_exists's Verhalten bei magisch hinzugefügten Eigenschaften

Eine Eigenschaft kann mit a existierennull Wert, so kann ich nicht verwenden__isset magische Methode, um zu wissen, ob eine Immobilie existiert oder nicht. Ich kann auch nicht verwendenproperty_exists as Eigenschaften werden mit magischen Methoden hinzugefügt.

Hier ist ein Beispiel, aber dies ist nur ein Beispiel, weil in meiner App,Eigenschaften, die magisch festgelegt wurden, werden außerhalb des Objekts gespeichert.

class test {

    private $data = array();

    public function __get($key) {
        echo "get $key\n";
        return array_key_exists($key, $data) ? $data[$key] : null;
    }

    public function __set($key, $value) {
        echo "set $key = $value\n";
        $this->data[$key] = $value;
    }

    public function __isset($key) {
       echo sprintf("isset $key ( returns %b )", isset($this->data[$key]));
       return isset($this->data[$key]);
    }

}

$test = new test();
$test->x = 42;
isset($test->x); // 1

$test->y = null;
isset($test->y); // 0
property_exists($test, 'y'); // 0

Also hier ist meine Frage:

Gibt es eine magische Methode oder eine SPL-Schnittstelle zu implementierenproperty_exist mit magisch hinzugefügten Eigenschaften?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage