【发布时间】:2011-06-08 02:11:55
【问题描述】:
在 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,您还有什么建议?
我怀疑这会正常工作,但要寻找可能遇到麻烦的边缘情况。是的,我知道我可以更改错误报告设置。但我不想隐藏通知,我想修复它们。
【问题讨论】:
-
E_DEPRECATED 属于通知类,而不是错误。我不确定您是否需要尽快修复它(magic_quotes 在 php 4.2 左右被宣布弃用)。至于正则表达式:您应该在
new之后添加\b,否则这是一种可行的重写方法。但是您只能测试它是否会损害预期的处理逻辑(虽然不太可能)。 -
@mario E_DEPRECATED 只是一个错误级别。无论哪种方式引用它都是合适的。 \b 很好。
标签: php