通过引用分配新的返回值在
PHP 5.3中已经为
deprecated.因此,
$obj =& new Foo();
现在抛出一个E_DEPRECATED错误.
当将具有大量旧版代码的大型应用程序升级到5.3时,会导致大量不需要的通知.
作为这个问题的潜在解决方案,我正在考虑使用正则表达式来查找和替换所有=& new with = new.例如,以下将找到所有的PHP文件,并且清除所有的实例=&新:
find ./ -name '*.PHP' | xargs perl -p -i -e 's/=(\s*)&(\s*)?new\b/= new/g'
寻找以下问题的答案:
>它会正常工作吗?我遇到什么潜在的问题?
>如果没有,代码的例子代替=& new with = new将改变PHP 5.3中的行为.
>任何有这种流行图书馆的例子都会被称为导致问题.
>还有什么其他的想法,你建议处理大量的&新?
我怀疑这将工作正常,但寻找边缘的情况下,我可能遇到麻烦.是的,我知道我可以更改错误报告设置.但我不想隐藏通知,我想修复它们.
你的感觉是对的它通常工作正常,但有边缘的情况下它没有.
使用=&有以下差异:
> =&将尝试使右侧产生参考; =不会 – 即使右侧能够产生一个引用,就像通过引用返回的函数一样.
> =&将打破旧的参考集,并将左侧和右侧两者都放在一个新的参照集中,而=将将与左侧相同的引用集中的所有元素的值更改为右侧的值.
在这种情况下,第一个差异和第二个差异的一半是无关紧要的.在赋值后,只有一个变量带有新对象*的值,而单个元素的引用集是没有意义的.然而,事实上=&打破以前的参考集是重要的:
<?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)
*除非构造函数泄漏引用,否则即使泄漏,构造函数中的$也可能是一个不同的变量,即使它指向同一个对象.所以我怀疑由于这个原因可以观察到行为差异.