Предварительный инкремент в PHP с магическим get и set определены

У меня есть проблема, которая долгое время мешала тому, как я хочу делать вещи. Это связано с использованием магии get и set в PHP и попыткой выполнить предварительное увеличение объекта. У меня есть следующий класс PHP:

class Foo {
    public $object;

    function __construct() {
            $this->object = array("bar" => 1);
    }

    function & __get($name) {
            return $this->object[$name];
    }

    function __set($name, $value) {
            echo "Old value: ". $this->object[$name] ." - New value: ". $value ."\n";
            $this->object[$name] = $value;
    }
}

Обратите внимание на &в методе __get. Теперь я запускаю этот код:

$o = new Foo();

echo "First test\n";
$o->bar = 2;

echo "Second test\n";
$o->bar = $o->bar + 1;

echo "Third test\n";
$o->bar += 1;

echo "Fourth test\n";
++$o->bar;

И вывод:

First test
Old value: 1 - New value: 2
Second test
Old value: 2 - New value: 3
Third test
Old value: 4 - New value: 4
Fourth test
Old value: 5 - New value: 5

Третий и четвертый тесты имеют неожиданное (для меня) поведение. Похоже, $this->object['bar'] возвращает значение, которое нужно установить, а не старое значение, как я и ожидал. Почему значение уже установлено еще до того, как оно фактически установлено?

Если я удалю &из метода __get, это будет работать, так что я предполагаю, что это как-то связано с управлением ссылками, которое делает PHP. Но я бы ожидал, что третий тест будет вести себя так же, как второй, но это не так.

Я действительно не понимаю этого. Любая помощь приветствуется.

5
задан JasonMArcher 23 May 2015 в 21:45
поделиться