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

时间:2011-01-12 20:06:28

标签: php

在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'

寻找以下问题的答案:

  1. 它能正常工作吗?我可能遇到哪些潜在的问题?
  2. 如果没有,将=& new替换为= new的代码示例将改变PHP 5.3中的行为。
  3. 任何有流行库的例子都会引起问题。
  4. 您建议还有哪些其他想法可以解决大量=& new
  5. 的问题

    我怀疑这样可以正常工作,但是在寻找可能遇到麻烦的边缘情况。是的,我知道我可以更改错误报告设置。但我不想隐藏通知,我想解决它们。

3 个答案:

答案 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