在PHP 5.3中,通过引用分配new的返回值为deprecated。因此,
$obj =& new Foo();
现在抛出E_DEPRECATED
错误。
将具有大量遗留代码的大型应用程序升级到5.3时,会导致大量不需要的通知。
作为此问题的潜在解决方案,我正在考虑使用正则表达式查找并替换=& new
与= new
的所有实例。例如,以下内容将查找所有PHP文件,并清除=& new
的所有实例:
find ./ -name '*.php' | xargs perl -p -i -e 's/=(\s*)&(\s*)?new\b/= new/g'
寻找以下问题的答案:
=& new
替换为= new
的代码示例将改变PHP 5.3中的行为。=& new
?我怀疑这样可以正常工作,但是在寻找可能遇到麻烦的边缘情况。是的,我知道我可以更改错误报告设置。但我不想隐藏通知,我想解决它们。
答案 0 :(得分:15)
你的感觉是对的。它通常可以正常工作,但有一些边缘情况不会。
使用=&
与=
:
=&
会尝试让右侧产生参考; =
不会 - 即使右侧能够产生引用,例如通过引用返回的函数。=&
会破坏旧的参考集并将左侧和右侧都放在一个新的参考集中,而=
将更改左侧和右侧的所有元素的值一边是右边的价值。在这种情况下,第一个差异和第二个差异是不相关的。在赋值之后,将只有一个变量具有新对象*的值,并且单元素引用集没有意义。但是,=&
打破先前参考集的事实很重要:
<?php
$g = 4;
$v =& $g;
$v = new stdclass();
var_dump($g); // object(stdClass)#1 (0) { }
$g = 4;
$v =& $g;
$v =& new stdclass();
var_dump($g); // int(4)
*除非构造函数泄漏引用,但即使它泄漏,构造函数内的$this
也可能是一个不同的变量,即使它指向同一个对象。所以我怀疑是否会因此而观察到行为差异。
答案 1 :(得分:3)
是的,您应该只能将=& new
替换为= new
。默认情况下,PHP 5.3中的对象通过引用传递,因此不会改变任何行为。
+1用于修复通知而不是隐藏它们。
答案 2 :(得分:2)
应该没有任何问题。在最坏的情况下,这会稍微降低PHP 4上的应用程序速度,但它肯定不会改变功能。
理论上唯一可能遇到的问题是有人在字符串中写了=& new
。我知道,这是非常不可能的,但是如果你想真正替换'=' T_WHITESPACE? '&' T_WHITESPACE? T_NEW
的所有出现,你应该使用Tokenizer。