在整个网络[1] [2] [3],它说,因为PHP 5.0.0"通过引用分配新的返回值"给出一个E_DEPRECATED
或E_STRICT
取决于你的PHP版本(E_DEPRECATED
直到5.3才存在,所以它就是E_STRICT
在这之前).
因此,我的理解是这段代码应该发出这样的警告:
error_reporting(E_ALL | E_STRICT);
class A
{
}
$a =& new A();
Run Code Online (Sandbox Code Playgroud)
但是,我在两个完全不同的服务器上试过这个(一个运行PHP 5.3,一个运行PHP 5.2)并且实际上都没有给出任何消息!这是怎么回事?我的理解是不正确的还是在这两台服务器上发生了什么奇怪的事情?
(我也觉得很奇怪,这是不赞成的,看到它$a = null; $b =& $a; $b = new A();
不一样$a = null; $b =& $a; $b =& new A();
,但如果我误解了被弃用的东西,这只是问题的一部分......)
作为对OP的回应,这条评论为他指明了正确的方向:
如果问题出在其他地方,我一点也不感到惊讶:尝试设置 E_ALL | 直接在 php.ini 中添加 E_STRICT,如果您在命令行上运行此代码,也不要忘记更改 php-cli.ini。
还要仔细检查错误是否没有通过执行ini_set('display_errors',1);1
. 如果您在 Windows 机器上运行此程序,则过去存在一些错误。
由于OP还指出警告是在执行任何代码之前生成的,所以我有一种预感,预期的警告是在编译时而不是运行时引发的,所以我再次查看了文档。在那里,我发现了这张大红框纸条,证实了我的怀疑:
大多数 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 文件中设置错误报告。