Магические методы не работают внутри ArrayObjects? - PullRequest
1 голос
/ 05 ноября 2011

Я столкнулся с проблемой с моим кодом, которую я не смог объяснить.Единственное, о чем я могу думать, это то, что магические методы просто не работают внутри ArrayObjects.Например, для следующего класса:

class foo extends ArrayObject {

    public $bar = '@@@';

    public function __construct() {
        parent::__construct(array(), ArrayObject::ARRAY_AS_PROPS);
    }

    public function __get($prop) {
        return '@@@';
    }
}

В следующих строках выдается сообщение об ошибке «Примечание: неопределенный индекс: test ...»

$foo = new foo();
echo $foo->test;

Тем не менее эти строки работают нормально:

$foo = new foo();
echo $foo->bar;

Я сумасшедший или это известная проблема?

1 Ответ

3 голосов
/ 05 ноября 2011

"Волшебная" функция, которую вы ищете, называется offsetGet Документы , а не __get:

class foo extends ArrayObject {

    public $bar = '@@@';

    public function __construct() {
        parent::__construct(array(), ArrayObject::ARRAY_AS_PROPS);
    }

    public function offsetGet($prop)
    {
        if (!parent::offsetExists($prop))
            return '@@@';
        return parent::offsetGet($prop);
    }
}

$foo = new foo();
echo $foo->test; # @@@

Я точно не знаю, но __get недоступен, поскольку вы выходите из внутреннего класса, который каким-то образом его блокирует.

...