Обработчик ошибок PHP срабатывает при использовании die в контексте outputbuffer
Я разрабатываю свой PHP-фреймворк, и на данный момент я застрял со странным поведением на моей странице для отправки сообщений об ошибках.
Сама страница прекрасна, она ловит и перечисляет все ошибки, используя собственный обработчик ошибок, зарегистрированный с помощью set_error_handler(), и может распечатать строку, файл, вызванные переменные и тому подобное. Он даже отлично запускает множественные ошибки (за исключением фатальных или синтаксических ошибок, которые приводят к задержке скрипта), но все равно отправляет фатальную или даже синтаксическую ошибку в этом случае и даже показывает мне, даже когда его нулевой указатель в шаблоне, где обнаружена ошибка, которая прекрасна и работает потрясающе.
Эта система работает "используя set_error_handler"! Весь вывод (рендеринг html /php шаблонов) реализован с использованием "ob_start" и "ob_get_clean" - контекста outputbuffer.
Затем я проверяю, перехватил ли обработчик ошибок какие-либо ошибки (будет записан в массив в классе обработчика ошибок), и если есть ошибки и включено отображение ошибок (режим разработчика = вкл.), Отобразится страница диспетчера ошибок. вместо содержимого страницы.
Однако, поскольку я реализовал это, у меня есть одно странное поведение, которое я не хочу:
Всякий раз, когда я использую die() внутри контекста outputbuffer ((ob_start() ... ob_get_clean())), зарегистрированный метод обработчика ошибок вызывается с отображением пустого списка ошибок, и даже 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>
-> Этот метод die(), приведенный выше, вызовет ошибку, потому что registerTemplate.php был когда-то проанализирован с использованием includeTemplate("reigsterTemplate"); который расположен в контексте ob_start (). Неважно, произошла ошибка раньше или нет, или даже если я просто поместил die("!"); без любой вызванной переменной это вызовет ошибку.
Если я добавлю die() до или после контекста include_template, в верхней области он будет работать как обычно, а обработчик error_handler не сработает, как и должно работать.
Может кто-нибудь сказать мне, почему это происходит? Большое спасибо!
(Важно: опять-таки, этот код нереалистичен, я знаю, что это всего лишь черновик из того, как вещи выглядят очень плохо, не беспокойтесь, давая мне подсказки, что это плохой способ делать вещи. Вся вещь совершенно объектно-ориентирована и очень хорошо структурирован. Я только что сделал этот небольшой набросок, чтобы вы, ребята, поняли, в каком порядке вызываются методы и как возникает моя проблема, потому что публикация моего кода потратит меня и вас много времени, так как это будет слишком большим и сложным).