PHP, обработка syntax error
Доброго времени суток.
Пишу небольшой ErroeHandler для обработки ошибок PHР, но не могу разобраться с синтаксическими ошибками, к примеру, если пропущена точка с запятой, либо стоит некорректный символ.
Какие есть способы искусственно обработать синтаксические ошибки PHP?
Ответы (2 шт):
Вряд ли есть, потому что анализатор не может знать, что конкретно имел в виду разработчик и поэтому делать за него работу не имеет смысла, потому что смысл может быть поменян совсем на противоположный
Примеры банальные.
function test {
if () {
...
if (...) {
тут код В БЛОК IF
тут код ВНЕ IF
ещё код ВНЕ IF
}
}
Забыта закрывающая скобка у второго if. Где анализатор должен автоматически поставить скобку? Как он должен понять, что после первой строчки, а не после последней?
Или вот такая ошибка:
echo $wrong[key];
// Use of undefined constant key
Что должен сделать анализатор? Обернуть в кавычки? А если программист забыл там доллар и хотел написать
echo $wrong[$key];
Еще один пример, чисто виртуальный, хоть и глуповат
$test= 1;
echo $test '1';
Что здесь должно быть? Может быть . (конкатенация), а может быть + (сложение). И что надо выбрать анализатору?
И таких примеров тысячи. Анализатор просто не знает что вы хотели, т.к. на одну синтаксическую ошибку найдётся тысячи вариантов для исправления (сравнимо комбинациям в шахматах, пойти можно куда угодно, но вот тактику, которую нужно соблюсти, знаете только вы). Так что отбросьте мысли о магическом инструменте, т.к. инструмент, читающий мысли ещё не изобрели %)
Вопрос хороший, но не до конца продуман.
Синтаксические ошибки обрабатываются точно так же как и любые другие.
Разумеется, обработчик не сработает, если если ошибка допущена до того, как он успел загрузиться: например, в скрипте, который его подключает, или если ошибка в самом обработчике. Но это всё очевидные кейсы, с которыми можно смириться.
Но если ошибка синтаксиса произошла в любом другом файле, после того как обработчик уже загрузился, то она прекрасно обработается.
Представим, что у нас есть файл-загрузчик приложения (который практически никогда не меняется), который сначала подключает системные файлы (включая обработчик ошибок), а потом инклюдит файлы с бизнес-логикой. При такой схеме все ошибки в файлах с бизнес-лоикой будут прекрасно ловиться:
<?php
require 'error_handler.php';
require 'controller.php';
ошибка синтаксиса в controller.php будет поймана так же, как и любая другая. То есть в 99.99% файлов проекта ошибки синтасиса будут ловиться.