我正在开发我的PHP框架,目前我在错误调度页面中遇到了一个奇怪的行为。
页面本身很漂亮,它使用注册了“set_error_handler()”的自定义错误处理程序捕获并列出所有错误,并且可以打印行,文件,调用的变量等。它甚至可以完美地触发多个错误(除了致命或语法错误导致脚本保持)但在这种情况下仍然调度致命甚至语法错误甚至显示我,即使它在模板中的空指针错误位置很漂亮,效果很棒。
此系统“使用set_error_handler”工作!整个输出(渲染html / php模板)使用“ob_start”和“ob_get_clean” - outputbuffer context实现。
接下来,我检查错误处理程序是否捕获了任何错误(将在错误处理程序的类中的数组中写入)以及是否存在错误并启用错误显示(开发人员模式=打开)错误调度程序页面将显示而不是页面的内容。
然而,自从我实施以来,我有一个我不想要的奇怪行为:
每当我在outputbuffer context((ob_start()... ob_get_clean())中使用die()时)调用已注册的错误处理程序方法,并显示空错误列表,甚至error_get_last()为空,但他仍然触发了该死的功能。
这是非常令人不安的,因为你不能使用die来保存脚本以测试某些变量的输出,这些变量在开发中是令人不安的,对我来说似乎是一种不寻常的行为。
我认为发布我的整个代码会使事情变得有点太复杂,你不能理解为什么我留下一个解释情况的小草案,它与我在课堂上看起来基本相同:
//index.php
$errorList = array();
function myErrorHandler($errorType, $errorString, $errorFile, $errorLine, array $errorContext) {
global $errorList;
$errorList[] = $errorString;
}
set_error_handler("myErrorHandler");
//Here my classses and entire rest of framework is loaded...()
//Initialise output
$output = "";
//This method parses templates, it remotely close works like that...
function includeTemplate($templatePath) {
global $output;
ob_start("myErrorHandler");
include($templatePath);
$output .= ob_get_clean(); //Attach to output
}
//This method is called at the very end, it flushes the output, wether by displaying error-dispatcher or page content to be shown.
function flush() {
global $output;
if(count($errorList) > 0) {
echo implode("<br />", $errorList);
} else {
echo $output;
}
}
//Template file: registerTemplate.php
<div class="container">
<Some template output here, doesnt matter if an error occured...>
<?php die($var); ?> //<- Error rised -> Entering "myErrorHandler()" -> but why????
</div>
- &GT;上面的die()会出现错误,因为registerTemplate.php是使用includeTemplate(“reigsterTemplate”)解析的;它位于ob_start()上下文中。如果之前发生错误或者即使我只是放置死亡(“!”)也没关系;没有任何调用变量,它将发生错误。
如果我将die()放在include_template上下文之前或之后,则在较高范围内它会照常工作,而error_handler不会触发,因为它应该可以工作。
谁能告诉我为什么会这样?非常感谢!
(重要的是:这个代码再次不现实我知道它只是一个关于事情看起来很勉强的草案,不要打扰那个给我提示这是一个糟糕的做事方式。整个事情是完美的对象我刚刚制作了这个小小的草稿,让你们了解这些方法被调用的顺序以及我的问题是如何出现的,因为发布我的代码会浪费我和你的大量时间因为它太庞大而复杂这里)。