传递新变量作为参考
Pass new variable as reference
我在 class 中有一个带有此签名的方法:
public static function execute($query, $data = array(), &$result = NULL, $onlyOne = true)
重点是对数据执行 SQL 查询(如果相关)并修改结果变量(如果设置为 true),如果调用者只对第一行感兴趣,最后只返回第一行。它处理 SQL 错误等,总的来说是一件方便的事情,因为我试图将脚本中的 sql 查询减少到单行或两行(检查结果)。
现在我遇到了一个问题:
Db::execute("query with :data", array(":data" => "data"), ($row = true));
PHP 抱怨 $row 不是变量:
Strict standards: Only variables should be passed by reference
据我所知,PHP 作用域是函数范围的而不是块范围的(例如在 C++ 中)。因此 $row
应该是我的函数范围内的一个变量,并且可以作为引用传递(而不仅仅是函数调用中的临时变量)。如果我事先声明它,它可以工作,但它会稍微膨胀代码。有没有办法像这样在函数调用中保留该变量的声明?
编辑:添加到已接受的答案中。可以为引用分配任何默认值,因此我将签名更改为:
public static function execute($query, $data = array(), &$result = -1, $onlyOne = true)
允许我使用以下方式调用它:
Db::execute("query with :data", array(":data" => "data"), $row);
没有预先声明结果变量。在内部,我只是检查 $result 是否不是 -1(或者我可以检查它是否为 NULL,表示新的空变量)以填充结果。
Db::execute("query with :data", array(":data" => "data"), ($row = true));
^^^^^^^^^^^^^
这是一项作业。在 PHP 中,赋值的结果是被赋值的值,因此您将 true
传递给您的函数。该参数被定义为引用,您不能创建对 true
.
的引用
你必须做的:
$row = true;
DB::execute(....., $row);
我在 class 中有一个带有此签名的方法:
public static function execute($query, $data = array(), &$result = NULL, $onlyOne = true)
重点是对数据执行 SQL 查询(如果相关)并修改结果变量(如果设置为 true),如果调用者只对第一行感兴趣,最后只返回第一行。它处理 SQL 错误等,总的来说是一件方便的事情,因为我试图将脚本中的 sql 查询减少到单行或两行(检查结果)。
现在我遇到了一个问题:
Db::execute("query with :data", array(":data" => "data"), ($row = true));
PHP 抱怨 $row 不是变量:
Strict standards: Only variables should be passed by reference
据我所知,PHP 作用域是函数范围的而不是块范围的(例如在 C++ 中)。因此 $row
应该是我的函数范围内的一个变量,并且可以作为引用传递(而不仅仅是函数调用中的临时变量)。如果我事先声明它,它可以工作,但它会稍微膨胀代码。有没有办法像这样在函数调用中保留该变量的声明?
编辑:添加到已接受的答案中。可以为引用分配任何默认值,因此我将签名更改为:
public static function execute($query, $data = array(), &$result = -1, $onlyOne = true)
允许我使用以下方式调用它:
Db::execute("query with :data", array(":data" => "data"), $row);
没有预先声明结果变量。在内部,我只是检查 $result 是否不是 -1(或者我可以检查它是否为 NULL,表示新的空变量)以填充结果。
Db::execute("query with :data", array(":data" => "data"), ($row = true));
^^^^^^^^^^^^^
这是一项作业。在 PHP 中,赋值的结果是被赋值的值,因此您将 true
传递给您的函数。该参数被定义为引用,您不能创建对 true
.
你必须做的:
$row = true;
DB::execute(....., $row);