如何避免PHP中的调用时传递引用弃用错误?

Edw*_*uay 29 php

我正在尝试减少发送到我的apache服务器日志的警告.

一个警告是:

已弃用调用时传递引用.

这是我很难想象为什么这个被废弃了,因为它是这样一个有用的编程功能,基本上我这样做:

public function takeScriptsWithMarker(&$lines, $marker) {

    ...
}
Run Code Online (Sandbox Code Playgroud)

我调用这个函数重复从它得到结果并处理它们,但也让数组$ lines通过重复发送到这个方法来建立.

  1. 重新编程这将是广泛的.
  2. 我不想只是"关闭警告",因为我想看到其他警告.

因此,由于不推荐使用call-by引用,获得此模式功能的"可接受方式"是什么:即将字符串数组发送到方法中,让方法更改它们,然后继续使用阵列?

Ion*_*tan 51

实际上,定义函数的方式没有问题.调用函数的方式有问题.所以对于你的例子,而不是像下面那样调用它:

takeScriptsWithMarker(&$lines, $marker);
Run Code Online (Sandbox Code Playgroud)

你会这样称呼:

takeScriptsWithMarker($lines, $marker); // no ampersands :)
Run Code Online (Sandbox Code Playgroud)

因此该功能仍然可用.但我不知道这种变化背后的原因.

  • "我不知道这种变化背后的原因." 长话短说,*函数*负责决定通过引用传递什么,而不是*调用者*.当调用者可以通过引用传递任意参数时,可能会导致函数作者没有准备好的副作用. (19认同)
  • 来自allow_call_time_pass_reference的文档:"在函数调用时通过引用传递参数已被弃用,因为代码清洁原因.如果没有声明参数是通过引用传递的,函数可以以未记录的方式修改其参数.为了防止副作用,它是最好只指定在函数声明中通过引用传递哪些参数." (8认同)
  • @Frank,谢谢你的澄清.不好的一点是,只看一个函数调用,你不知道任何这些参数可以通过引用传递.因此,您可能会在不知情的情况下在函数中获得副作用.在我看来,在函数定义和函数调用中都有一个&符号的要求会好得多. (2认同)
  • @Ionut:不仅仅是看功能的签名足以消除疑虑吗?如果你没有源代码或文档,你会遇到比复制&,恕我直言更糟的问题 (2认同)

Jas*_*son 9

如上面在上一个答案中所述,问题是在CALL时间,而不是定义时间..因此您可以将函数定义为:

function foo(&$var1,$var2,$var3=null){
    // procesing here
}
Run Code Online (Sandbox Code Playgroud)

然后打电话给:

$return = foo($invar1,$invar2);
Run Code Online (Sandbox Code Playgroud)

你的第一个invar是通过引用传递的,第二个不是.

当您尝试这样调用时出现错误:

$return = foo(&$invar1,$invar2);
Run Code Online (Sandbox Code Playgroud)


Ott*_*ger 6

您可以设置allow_call_time_pass_referencetrue您的php.ini文件.但这是一个黑客.