Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP require语句-失败,但抛出E_警告而不是E_编译错误_Php_Error Handling_Require_Php4 - Fatal编程技术网

PHP require语句-失败,但抛出E_警告而不是E_编译错误

PHP require语句-失败,但抛出E_警告而不是E_编译错误,php,error-handling,require,php4,Php,Error Handling,Require,Php4,我将系统中的一个文件移动到组织的子文件夹中,这又破坏了require语句的相对路径。这应该会导致E\u COMPILE\u错误警告。但是,应用程序中的自定义错误处理程序没有捕获该错误,而是将该错误捕获为E_警告。因此,我们的客户处理程序记录了消息,结果PHP屏幕显示为空,就像die()已运行。以下是本地处理程序创建的日志: E_警告main(XXXXXX.php):无法打开流:没有此类文件或目录xxx/xxx.php第9行01-26-2012 09:44:27 AM 01-26-2012 10:

我将系统中的一个文件移动到组织的子文件夹中,这又破坏了
require
语句的相对路径。这应该会导致
E\u COMPILE\u错误
警告。但是,应用程序中的自定义错误处理程序没有捕获该错误,而是将该错误捕获为
E_警告
。因此,我们的客户处理程序记录了消息,结果PHP屏幕显示为空,就像
die()已运行。以下是本地处理程序创建的日志:

E_警告main(XXXXXX.php):无法打开流:没有此类文件或目录xxx/xxx.php第9行01-26-2012 09:44:27 AM 01-26-2012 10:03:24 AM

可能需要注意的是,我们的系统仍在使用破旧的
php4

你知道为什么require会发出E_警告吗?由于我们看不到任何错误消息,因此花了更长的时间来找出问题所在


编辑:这个应用程序确实做了一个要求。自定义错误处理程序只是使用PHP的set_error_处理程序函数。因此,除了警告、通知和用户错误之外,不应该调用它


附加编辑:

也许结构与此有关?以下是它的工作原理: (->平均值包括,=>平均值要求)

main->File1.php=>File2.php

它是否会因为包含但不是必需的File1.php而引发警告?这对我来说可能有道理,但似乎是个小故障?我可能需要在PHP5上进行测试


分辨率


我已经扫描了我们的应用程序,发现:

错误报告(E|U错误| E|U警告| E|U解析)

因此,E_COMPILE_错误将不会显示。此外,@DaveRandom抛出警告,然后抛出致命错误是正确的

改成 错误报告(E|U错误| E|U警告| E|U解析| E|U编译|错误);
显示错误消息。

它确实在执行请求吗?E_警告似乎暗示您在那里使用include而不是require。。。或者PHP4在这方面的表现有所不同?我真的记不起来了。

当您对不存在的文件调用Require时,它至少会发出一次警告。然后它发出一个
E\u COMPILE\u错误
,然后消失

:

用户定义的函数无法处理以下错误类型:E_error、E_PARSE、E_CORE_error、E_CORE_WARNING、E_COMPILE_error、E_COMPILE_WARNING,以及在调用set_error_handler()的文件中引发的大部分E_STRICT


因此,恐怕您的自定义错误处理程序永远不会捕获错误。

如果没有看到您的自定义错误处理程序,就无法判断。一个失败的require应该会抛出一个编译错误,但是由于您正在进行自定义工作,请检查它是否实际正常工作(失败?)。确保require语句中没有@符号,这会抑制错误报告。这绝对是一个require。我可以通过添加require来重新创建问题。我知道它不应该捕获E_COMPILE_错误。但是,所有其他致命错误都会通过PHP的错误报告设置显示在屏幕上。我可能需要为此设置一个测试。我扫描了我们的应用程序,发现了以下内容:错误报告(E|u error | E|u WARNING | E|u PARSE);因此,E_COMPILE_错误将不会显示。此外,@DaveRandom抛出警告,然后抛出致命错误是正确的。