PHP 5.4通话时间通过引用 – 易于修复吗?

有什么方法可以轻松解决这个问题,还是我真的需要重写所有的遗留代码?

PHP致命错误:通过引用的呼叫时间已被删除…在第30行

随着variables被传递到函数作为整个代码的引用,这种情况发生。

您应该在函数定义中通过引用来表示该调用,而不是实际的调用。 由于PHP开始显示版本5.3中的弃用错误,所以我认为重写代码是一个好主意。

从文档 :

函数调用没有参考符号 – 仅在函数定义上。 单独的函数定义足以通过引用正确地传递参数。 从PHP 5.3.0开始,当您在foo(&$a);使用&时,您会收到警告,指出“通过引用传递时间”已被弃用foo(&$a);

例如,而不是使用:

 // Wrong way! myFunc(&$arg); # Deprecated pass-by-reference argument function myFunc($arg) { } 

使用:

 // Right way! myFunc($var); # pass-by-value argument function myFunc(&$arg) { } 

PHP和引用有点不直观。 如果在适当的地方使用适当的引用可以提供大的性能改进或避免非常丑陋的解决方法和不寻常的代码。

以下将产生一个错误:

  function f(&$v){$v = true;} f(&$v); function f($v){$v = true;} f(&$v); 

这些都不能失败,因为他们可以按照下面的规则,但毫无疑问已经被删除或禁用,以防止传统的混乱。

如果他们确实工作,都涉及冗余转换为引用,第二个也涉及到一个冗余转换回范围内包含的variables。

第二个过去是可能的,允许一个引用被传递给那些不打算与引用一起工作的代码。 这对可维护性来说非常难看。

这将无能为力:

  function f($v){$v = true;} $r = &$v; f($r); 

更具体地说,它将参考变成一个正常的variables,因为你没有要求参考。

这将工作:

  function f(&$v){$v = true;} f($v); 

这看到你正在传递一个非引用,但想要一个引用,所以把它变成一个引用。

这意味着你不能将一个引用传递给一个函数,其中一个引用没有被明确地要求使其成为PHP对传递types严格要求的less数几个区域之一,在这种情况下,更多的是元types。

如果你需要更多的dynamic行为,这将工作:

  function f(&$v){$v = true;} $v = array(false,false,false); $r = &$v[1]; f($r); 

在这里,它看到你想要一个参考,已经有一个参考,所以留下它独自一人。 它也可能会链接的参考,但我怀疑这一点。

对于像我这样的读者来说,这是因为他们需要将一个巨大的遗留项目更新到5.6:正如这里的答案所指出的那样,没有一个快速的解决办法:你确实需要手动find每一个问题,并修复它。

我发现find项目中所有有问题的行的最方便的方法(使用全面的静态代码分析器,这是非常准确的,但我不知道任何,让你在编辑器中的正确位置马上)使用的是Visual Studio Code,内置了一个很好的PHP linter,它的searchfunction允许用Regexsearch。 (当然,您可以使用任何IDE /代码编辑器来执行PHP linting和Regexsearch。)

使用这个正则expression式:

 ^(?!.*function).*(\&\$) 

可以在整个项目范围内search&$仅在不是函数定义的行中出现。

这仍然会产生很多误报,但这确实使工作变得更容易。

VSCode的search结果浏览器可以让您轻松查找违规行:只需点击每个结果,然后查看那些下划线显示为红色的行。 那些你需要修复。