PHP 5.3并通过引用分配新的返回值

前端之家收集整理的这篇文章主要介绍了PHP 5.3并通过引用分配新的返回值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通过引用分配新的返回值在 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)

*除非构造函数泄漏引用,否则即使泄漏,构造函数中的$也可能是一个不同的变量,即使它指向同一个对象.所以我怀疑由于这个原因可以观察到行为差异.

猜你在找的PHP相关文章