Sprawdź, czy właściwość istnieje na magicznie ustawionych właściwościach

Szczególnie wiele jest pytań na ten tematten, ale to mi nie pomaga.

Między nimi jest wieloznacznośćproperty_exists iisset więc zanim zadam pytanie, zamierzam to wskazać:

property_exists

property_exists sprawdza, czy obiekt zawiera właściwość, nie patrząc na jego wartość, tylko patrzy na jego wartośćwidoczność.

W poniższym przykładzie:

<?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 sprawdza, czy wartość istnieje w danej właściwości, biorąc pod uwagę, że nie jest ustawiona, jeśli wartość jest równafalse i 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 iproperty_existszachowanie magicznie dodanych właściwości

Właściwość może istnieć za pomocąnull wartość, więc nie mogę użyć__isset magiczna metoda, aby wiedzieć, czy dana właściwość istnieje czy nie. Nie mogę też użyćproperty_exists ponieważ właściwości są dodawane za pomocą metod magicznych.

Oto przykład, ale to tylko przykład, ponieważ w mojej aplikacjimagicznie ustawione właściwości są przechowywane poza obiektem.

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

Oto moje pytanie:

Czy istnieje implementacja magicznej metody lub interfejsu SPLproperty_exist z magicznie dodanymi właściwościami?

questionAnswers(2)

yourAnswerToTheQuestion