Вы явно не выводите уведомления, иначе вы получили бы ошибку
Примечание: косвенное изменение перегруженного свойства Foo :: $ bar не имеет
эффект
То, что вы пытаетесь сделать, просто невозможно. Существует только один способ сделать массивы, полученные с помощью __get
доступными для записи, но, скорее всего, это не то, что вам нужно.
<?php
class Foo {
protected $bar = array();
public function &__get($name) {
return $this->$name;
}
public function __set($name, $value) {
return $this->$name = $value;
}
}
$foo = new Foo();
$foo->bar = array('a', 'b', 'c');
echo $foo->bar[0]; // output "a"
$foo->bar[0] = 'z'; // fires warning
echo $foo->bar[0]; // output "z"
// all fine, but here's the catch:
$t =& $foo->bar;
$t = array('y');
echo $foo->bar[0]; // output "y"
Теперь, когда вы увидели, что возвращение значений по ссылке может быть проблемой, вас может заинтересовать ArrayObject . Что-то вроде
<?php
class Foo {
protected $bar = array();
public function __get($name) {
return new ArrayObject(&$this->$name);
}
public function __set($name, $value) {
return $this->$name = $value;
}
}
$foo = new Foo();
$foo->bar = array('a', 'b', 'c');
echo $foo->bar[0]; // output "a"
$foo->bar[0] = 'z'; // fires warning
echo $foo->bar[0]; // output "z"
// all fine, and no catch
$t =& $foo->bar;
$t = array('y');
echo $foo->bar[0]; // still outputs "z"