PHP Косвенная модификация перегруженного свойства - PullRequest
2 голосов
/ 06 октября 2010

У меня есть этот простой класс:

class A
{
    var $children=array();

    function &__get($name)
    {
        if($name==="firstChild")
        {
            if(count($this->children)) $ret=&$this->children[0];
            else $ret=null;
        }
        return $ret;
    }
}

Получив доступ к свойству firstChild, оно должно вернуть своего первого потомка по ссылке или null, если нет потомков.

$a=new A;
$c=&$a->firstChild;

Теперь, если в классе есть хотя бы один дочерний элемент, он прекрасно работает, но если он этого не делает (и должен возвращать ноль), он вызывает ошибку «Косвенное изменение перегруженного свойства».

Почему это происходит? Я не пытаюсь что-либо изменить, так что же это за "Косвенная модификация"? И почему, если я удаляю знак ссылки ($c=$a->firstChild;), он работает?

1 Ответ

4 голосов
/ 06 октября 2010

Я думаю, вы должны использовать empty() вместо count(). Одна из причин этого (цитата из руководства для count())

Если var не является массивом или объектом с реализованным интерфейсом Countable, будет возвращено 1. Есть одно исключение, если var равен NULL, будет возвращено 0.

Кроме того, если вы храните объекты в этом массиве, вам не нужно использовать ссылки, поскольку (в PHP 5+) объектам передаются ссылки по умолчанию.

...