Я разрабатываю свой 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 не сработает, как должно.
Может кто-нибудь сказать мне, почему это происходит? Большое спасибо!
(Важно: опять же, этот код нереалистичен, я знаю, что это всего лишь черновик из того, как вещи выглядят очень плохо, не беспокойтесь, давая мне подсказки, что это плохой способ делать вещи. Вся вещь идеально объектно-ориентированная и очень хорошо структурирован. Я только что сделал этот небольшой набросок, чтобы вы, ребята, поняли, в каком порядке вызываются методы и как возникает моя проблема, потому что публикация моего кода потратит меня и вас много времени, так как это будет слишком большим и сложным).
Задача ещё не решена.
Других решений пока нет …