Есть такая вот проблемка:
В коде используем eval для вычисления значения формул. В случае злостной ошибки в тексте выражения PHP фатально ошибается и всё, что остаётся в логах:
PHP Fatal Error: syntax error, unexpected ')' in Form/Validate/DinamicFormulaValues.php(149) : eval()'d code on line 1
Как вывести в консоль текст выражения, которое не удалось проевалить?
У меня в голове такой вариант:
$expression = "1 + 2)"; // тут явно похожая синтаксическая ошибка - незакрытая скобка
$file = tempnam('/tmp', 'eval')
file_put_contents($file, "<?php return {$expression};");
$value = include($file);
После этого возникает ошибка
Parse error: syntax error, unexpected ')' in /tmp/eval1kGtG7 on line 1
(при должной сноровке и чуточке разума это сообщение уходит почтой админу или разработчикам)
Открываю файл /tmp/eval1kGtG7 и вижу синтаксическую ошибку
Ещё вариант:
$result = exec('php -l "'.$file.'"', $output); // это консольная команда проверки синтаксиса файла PHP
echo $result; // -> Errors parsing /tmp/eval1kGtG7
echo implode("\n", $output); // -> PHP Parse error: syntax error, unexpected ')' in /tmp/eval1kGtG7 on line 1
Мне не нравится то, что файлов будет не просто много, а очень очень много, потому что через эту конструкцию проходит сотни проверок.
Ещё вариант
if (false === @eval($expression)) {
var_dump(error_get_last()); // выводится текст сообщения об ошибке
}
Недостаток этого варианта: в error_get_last() остаётся результат от интерпретации предыдущего неудачного выражения, а проверок будет сотни — получается, что будет много ложных срабатываний на рекорректность.
Есть ли другие варианты?