我有一个问题一直在破坏我想做的事情的方式很长一段时间。它与在 PHP 中使用魔法 get 和 set 以及尝试对对象进行预增量有关。我有一个 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 所做的引用管理有关。但我希望第三个测试的行为与第二个相同,但事实并非如此。
我真的不明白这个。任何帮助将非常感激。