加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 13:38:26 所属栏目:PHP教程 来源:网络整理
导读:通过引用分配新的返回值在 PHP 5.3中已经为 deprecated.因此, $obj = new Foo(); 现在抛出一个E_DEPRECATED错误. 当将具有大量旧版代码的大型应用程序升级到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*)?newb/= 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)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读