代码:
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()
这样的事情,但后来我收到了Cannot pass parameter 2 by reference
错误。
有谁知道如何解决这个问题?
答案 0 :(得分:2)
您不能通过引用传递它,因为只有变量可以通过引用传递。文字array($sql)
显然不是变量。
那就是说,这不是问题所在。
事实上,存在很多问题,主要是因为$sql
被“复制”了很多次:
array($sql)
fire()
时(由于未通过推荐传递)首先,您需要将数组定义为变量,例如$arr = array(&$sql);
然后通过引用保持当前“修复”传递&$arguments
。
最后,将您的匿名函数调整为function(&$sql)
,以便通过引用进行操作。
总而言之,如果您的代码不那么复杂,这可以变得更容易;)