代码:
final class SimpleEventManager {
private $listeners = array();
public function listen($event, $callable) {
$this->listeners[$event][] = $callable;
}
public function fire($event, array $arguments = array()) {
foreach ($this->listeners[$event] as $listener) {
call_user_func_array($listener, $arguments);
}
}
}
$manager = new SimpleEventManager;
$manager->listen('sql', function($sql) {
$sql .= " order by username desc";
});
$sql = "select * from users";
$manager->fire('sql', array($sql));
var_dump($sql); // is: select * from users
// want: select * from users order by username desc
所以基本上我希望我的事件监听器能够修改传入的参数。我尝试过执行诸如 array &$arguments = array()
之类的事情,但后来我得到了无法通过引用传递参数 2
错误。
有谁知道我该如何解决这个问题吗?
最佳答案
您不能通过引用传递它,因为只有变量可以通过引用传递。文字 array($sql)
显然不是变量。
也就是说,这不是问题。
事实上,存在很多问题,主要是因为$sql
被“复制”了很多次:
- 创建
数组($sql)
时 - 调用
fire()
时(由于未通过引用传递) - 调用匿名函数时(同样,不是通过引用传递)
首先,您需要将数组定义为变量,例如 $arr = array(&$sql);
然后保留当前通过引用传递 &$arguments
的“修复”。
最后,将您的匿名函数调整为 function(&$sql)
以便也可以通过引用工作。
总而言之,如果您的代码不是那么复杂,这可能会变得容易得多;)
关于php - 无法通过引用传递参数 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662026/