无法通过引用传递参数2

时间:2013-09-06 16:07:09

标签: php

代码:

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错误。

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您不能通过引用传递它,因为只有变量可以通过引用传递。文字array($sql)显然不是变量。

那就是说,这不是问题所在。

事实上,存在很多问题,主要是因为$sql被“复制”了很多次:

  1. 创建array($sql)
  2. 致电fire()时(由于未通过推荐传递)
  3. 调用匿名函数时(再次,不通过引用传递)
  4. 首先,您需要将数组定义为变量,例如$arr = array(&$sql);

    然后通过引用保持当前“修复”传递&$arguments

    最后,将您的匿名函数调整为function(&$sql),以便通过引用进行操作。

    总而言之,如果您的代码不那么复杂,这可以变得更容易;)