Run-Time Проверка Синтаксиса PHP с помощью eval
Проверяем на E_PARSE ошибки строку кода или файл
Функция языковая конструкция eval предназначена для выполнения произвольного PHP-кода из текстовой строки. В случае ошибки при парсинге строки кода она возвращает false. Иначе значение при return (null если его нет). Если мы поместим "return true;" перед остальным кодом - произойдёт только проверка синтаксиса без выполнения остального кода:
function check_syntax($code) {
return @eval('return true;' . $code);
}
var_dump( check_syntax("echo 123") ); // выведет false, т.к. пропущена точка с запятой
Для проверки синтаксиса php-файла только добавим закрывающий php-тэг после return true; (т.к. eval начинает обработку в режиме php-script, мы переходим в html-mode):
function check_syntax_file($filename) {
return @eval('return true; ?>' . file_get_contents($filename));
}
var_dump( check_syntax_file("php_syntax_t.php") );
Зачем?
Например, чтобы избежать падения скрипта при include-инге неизвестного (пользовательского, создаваемго автоматически) файла, или кода из БД.
Ловим E_PARSE-ошибки в любом коде
E_PARSE-ошибки внутри eval-кода нельзя поймать с помощью обычного set_error_handler(), и уж тем более использовать это, не исполняя eval-код. Поэтому мы будем ловить их, используя расширение Parsekit PECL. Примерно так:
function check_syntax_Ex($code) {
set_error_handler("_evalErrHandler");
parsekit_compile_string($code, $errors, PARSEKIT_QUIET);
restore_error_handler();
return (bool)!$errors;
}
function _evalErrHandler($errno, $errstr, $errfile, $errline)
{
switch ($errno) {
case E_PARSE:
echo "Eval error ($errno) $errstr in $errfile line $errline";
break;
}
return true; // don't execute PHP internal error handler
}

декабря 20, 2009 в 21:56
запомнить все...
Проверяем на E_PARSE ошибки строку кода или файл Функция языковая конструкция eval предназначена для[...]...