PHP:通过引用传递类成员不起作用


PHP: passing class member by reference not working

有人在这个问题中要求提供一个注册变量更改的事件处理程序:PHP如何检测变量的更改?

我试图用PHP的神奇函数__get__set开发一个快速类。这一直有效,直到我通过引用将成员传递到正常函数中,它不再触发事件。

这是一个错误,还是不可能的事情,或者我只是错过了什么?

<?php
header("content-type: text/plain");
class WatchVar {
    private $data = array();
    private $org = array();
    private $callbacks = array();
    public function __set($name, $value) {
        if (!array_key_exists($name, $this->data)) {
            $this->org[$name] = $value;
        } else {
            //variable gets changed again!
            $this->triggerChangedEvent($name, $value);
        }
        $this->data[$name] = $value;
    }
    public function &__get($name) {
        if (array_key_exists($name, $this->data)) {
            if ($this->data[$name] != $this->org[$name]) {
                //variable has changed, return original
                //return $this->org[$name];
                //or return new state:
                return $this->data[$name];
            } else {
                //variable has not changed
                return $this->data[$name];
            }
        }
    }
    public function addCallback($name, $lambdaFunc) {
        $this->callbacks[$name] = $lambdaFunc;
    }
    protected function triggerChangedEvent($name, $value) {
        //$this->data[$name] has been changed!
        //callback call like:
        call_user_func($this->callbacks[$name], $value);
    }
}

$test = new WatchVar;
$test->addCallback('xxx', function($newValue) { echo "xxx has changed to {$newValue}'n"; });
$test->xxx = "aaa";
echo $test->xxx . "'n";
//output: aaa
$test->xxx = "bbb";
//output: xxx has changed to bbb
echo $test->xxx . "'n";
//output bbb
function messyFunction(&$var) {
    $var = "test";
}
messyFunction($test->xxx);
//output: nothing, why?

更改此代码即可工作:

function messyFunction(&$var) {
    $var->xxx = "test";
}
messyFunction($test);
//output: xxx has changed to test

//输出:什么都没有,为什么

即使通过引用传递,该函数也只接收成员变量的克隆,而不是实例+魔术函数。