我将我们系统中的一个文件移动到一个子文件夹中进行组织,这又破坏了 require
语句的相对路径。这应该导致 E_COMPILE_ERROR
警告。但是,我们在应用程序中的自定义错误处理程序不是该错误,而是将错误捕获为 E_WARNING
。因此,我们的客户处理程序记录了消息,生成的 PHP 屏幕显示为空,就好像 die();
已运行一样。这是我们的本地处理程序创建的日志:
E_WARNING main(XXXXXX.php): 无法打开流:没有这样的文件或目录 xxx/xxx.php Line 9 01-26-2012 09:44:27 AM 01-26-2012 10:03 :24 点
值得注意的是,我们的系统仍在使用较差的旧 PHP 4
。
知道为什么 require 会抛出 E_WARNING 吗?由于我们看不到任何错误消息,因此需要更长的时间才能找出问题所在。
编辑:应用程序肯定在做一个要求。自定义错误处理程序只是使用 PHP 的 set_error_handler 函数。因此,除了警告、通知和用户错误之外,不应调用它。
附加编辑:
也许结构与此有关?这是它的工作原理: (-> 表示包含,=> 表示需要)
main->File1.php=>File2.php
是否因为包含但不是必需的 File1.php 而发出警告?这对我来说可能有意义,但似乎是一个小故障?我可能需要在 PHP 5 上对此进行测试。
决议
我扫描了我们的应用程序并发现了这个:
错误报告(E_ERROR | E_WARNING | E_PARSE);
因此,E_COMPILE_ERROR 不会出现。此外,@DaveRandom 是正确的,先抛出警告,然后抛出 fatal error 。
将其更改为 错误报告(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR); 显示错误信息。
最佳答案
当你在一个不存在的文件上调用它时,Require 至少发出一次这个警告。它然后发出一个E_COMPILE_ERROR
并结束。
However :
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.
所以我担心您的自定义错误处理程序永远不会捕获错误。
关于PHP require 语句 - 失败,但抛出 E_WARNING 而不是 E_COMPILE_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020853/