php - 无法通过引用传递参数 2

标签 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() 之类的事情,但后来我得到了无法通过引用传递参数 2 错误。

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

最佳答案

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

也就是说,这不是问题。

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

  1. 创建数组($sql)
  2. 调用 fire() 时(由于未通过引用传递)
  3. 调用匿名函数时(同样,不是通过引用传递)

首先,您需要将数组定义为变量,例如 $arr = array(&$sql);

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

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

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

关于php - 无法通过引用传递参数 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662026/

相关文章:

php - 函数内有两个 WHILE - 没有执行一个

php - 使用存储在属性中的类名

php - 将带时区的时间戳转换为可读日期

php - DOCUMENT_ROOT 不完整,缺少域文件夹

php - 嵌入观看链接中的视频

php - 如何检查表单中的任何字段是否为空

javascript - 使用数据库结果数组 codeigniter 填充 html 表单

php - 如何从 foreach 获取特定元素(来自数据库的数据(PDO))

php - 使用 php 和 jquery 将 xml 数据上传回服务器

php - 将 SQL 值存储为 PHP 变量 ("Object of class mysqli_result could not be converted to int")