У меня есть проблема, которая долгое время мешала тому, как я хочу делать вещи. Это связано с использованием магии 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. Но я бы ожидал, что третий тест будет вести себя так же, как второй, но это не так.
Я действительно не понимаю этого. Любая помощь приветствуется.