есть ли возможность переопределить функцию eval в PHP для отображения некоторой информации трассировки, т.е. из какого файла она была вызвана, в какой строке она произошла?
В некотором роде.
Вы можете добавить eval
к disable_functions
в php.ini
.Затем, когда вы вызываете eval
, вы получите фатальную ошибку function eval not found
или что-то подобное.
Затем с пользовательским обработчиком ошибок.
set_error_handler(function($errno, $errstr, $errfile, $errline){
if(false !== strpos($errstr,'eval')){
throw new Exception();
}else{
return false; //see below
}
//debug_print_backtrace() - I prefer exceptions as they are easier to work with, but you can use this arcane thing too.
});
Или что-то в этом роде (не проверено).
К сожалению, вы не можете переопределить eval
как свою собственную функцию.Eval на самом деле не функция, это языковая конструкция, такая как isset
, empty
, include
и т. Д. Например, function_exists('empty')
всегда ложно.Некоторые просто более «функциональны», чем другие.
В любом случае вам, вероятно, придется отключить eval
, я не могу придумать, как обойти это.
Подсказка
Не забудьте, что вы можете сделать это:
try{
throw new \Exception;
}catch(\Exception $e){
echo $e->getTraceAsString();
}
Что подавляет исключение (поэтому выполнение продолжается) и дает хорошийstacktrace.
Совет
http://php.net/manual/en/function.set-error-handler.php
Важно помнить, что стандартный обработчик ошибок PHPполностью игнорируется для типов ошибок, указанных в error_types, если только функция обратного вызова не возвращает FALSE
Поэтому, учитывая вышесказанное, вы можете / должны возвращать false для всех других ошибок.Тогда PHP сообщит о них.Я не уверен, что это действительно имеет большое значение в этом случае, поскольку это не обязательно должно быть в рабочем коде, но я чувствовал, что стоит упомянуть.
Надеюсь, это поможет.