PHP:通过引用传递类成员无效
有人要求在此问题中提供一个注册变量更改的事件处理程序: 我试图用PHP的神奇函数PHP:通过引用传递类成员无效,php,events,event-handling,Php,Events,Event Handling,有人要求在此问题中提供一个注册变量更改的事件处理程序: 我试图用PHP的神奇函数\uu get和\uu set开发一个快速类。直到我通过引用将成员传递到一个普通函数中,它才会再触发事件 这是一个bug,还是一些不可能的东西,或者我只是错过了一些东西 <?php header("content-type: text/plain"); class WatchVar { private $data = array(); private $org = array(); p
\uu get
和\uu set
开发一个快速类。直到我通过引用将成员传递到一个普通函数中,它才会再触发事件
这是一个bug,还是一些不可能的东西,或者我只是错过了一些东西
<?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
//输出:没有,为什么?
即使通过引用传递,函数也只接收成员变量的克隆,而不是instance+magic函数。没有输出,因为您不输出任何内容。您必须使用echo
。为什么不直接使用@str呢?echo在回调中:echo“xxx已更改为{$newValue}\n”代码>-当messyFunction()
更改对象成员时,应该像以下行一样触发回调before@MarkBaker我还没有试过所有新的Spl函数,我会看看它们!此外,我想知道我的代码出了什么问题,我想了解为什么它不起作用为什么它不起作用很重要?您已经拥有的代码清楚地表明,没有人希望它能够工作。这是一个黑客。它丑陋,充满魔力,增加了不必要的复杂性。如果您想进行事件驱动编程,请使用已建立的设计模式,如Subject/Observer、EventDispatcher、Signal/Slot等。