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% файлов проекта ошибки синтасиса будут ловиться.

→ Ссылка