11

在整个网络[1] [2] [3]上,它说自从 PHP 5.0.0“通过引用分配 new 的返回值”给出一个E_DEPRECATEDE_STRICT取决于您的 php 版本(E_DEPRECATED直到 5.3 才存在,所以它在E_STRICT那之前)。

因此,我的理解是这段代码应该给出这样的警告:

error_reporting(E_ALL | E_STRICT);

class A
{
}

$a =& new A();

但是,我已经在两台完全不同的服务器(一台运行 PHP 5.3 和一台运行 PHP 5.2)上尝试过这个,但实际上都没有给出任何消息!这是怎么回事?我的理解是不正确的还是这两台服务器上发生了什么奇怪的事情?

(我也认为这被弃用很奇怪,因为它$a = null; $b =& $a; $b = new A();与 不一样$a = null; $b =& $a; $b =& new A();,但如果我误解了什么被弃用,那只是问题的一部分......)

4

1 回答 1

2

作为对 OP 的回应,这条评论为他指明了正确的方向:

如果这里的问题出在其他地方,我一点也不感到惊讶:尝试设置 E_ALL | 直接在您的 php.ini 中添加 E_STRICT,如果您在命令行上运行此代码,请不要忘记更改 php-cli.ini。
还要仔细检查错误是否没有通过执行ini_set('display_errors',1);1. 如果你在 Windows 机器上运行它,过去有一些错误

由于 OP 还指出警告是在执行任何代码之前生成的,所以我有一种预感,预期的警告是在编译时而不是运行时引发的,所以我又看了一下docs。在那里,我发现了这张大红框字条,证实了我的猜想:

大多数 E_STRICT 错误是在编译时评估的,因此此类错误不会在增强 error_reporting 以包含 E_STRICT 错误的文件中报告(反之亦然)。

由于版本 5 PHP 实际上是一种“编译”语言(类似于 Java,代码被编译为 Zend Bytecode)。当 Zend 引擎编译带有在编译时发出的错误的代码时,脚本内error_reporting调用对天气没有影响或不报告这些错误:该error_reporting调用仅适用于运行时错误/警告。
也许这个:error_reporting(E_ALL | E_STRICT | E_COMPILE_ERROR);也值得一看

底线:
尽可能在 php.ini 文件中设置错误报告。

于 2012-11-06T17:15:17.327 回答