сценарий У меня очень большой php-файл, в нем много вызовов различных функций.
Этот файл обычно выполняется в «сложном» MVC, поэтому все объекты, методы, функции определены где-то выше.
Я пишу сырой PHP-скрипт, который будет выполняться из PHP CLI, который будет напрямую включать этот другой файл.
Меня не волнует ничего внутри файла, кроме вызова одной конкретной функции
example($string);
Я хочу определить example () в моем новом скрипте, чтобы сделать что-то основное, в этом случае записать в файл. например
example($string){
file_put_contents('file.txt', $string, FILE_APPEND);
}
Я не могу просто найти исходное определение example (), добавить туда свой новый код и выполнить все приложение как обычно, потому что example () вызывается повсеместно, и я действительно просто хочу нацелиться на этот конкретный файл.
Вопрос
Есть ли способ заставить PHP продолжать выполнение с неопределенными функциями? Я не хочу оборачивать все экземпляры других функций в try catch (исходный файл вообще не должен изменяться). я пытался set_exception_handler
и какой-то другой способ изменить обработку исключений в .ini, и хотя я могу настроить это, PHP все еще останавливает выполнение сценария при создании пользовательского исключения.
В настоящее время я создаю фиктивные функции в моем скрипте CLI
function already_defined_function(){
return null;
}
Так как это генерирует только предупреждения. Это утомительно и быстро ломается, когда я пытаюсь нацелиться на большое количество файлов.
Мне любопытно, существует ли абстрактный способ подавления каких-либо неопределенных методов / функций / экземпляров классов. В настоящее время я верю, что это невозможно.
Я попытался загрузить файл PHP в виде текста / строки, а затем с помощью токенизатора получить что-то вроде этого:
[1094] => Array
(
[0] => 319
[1] => example
[2] => 172
)
[1095] => (
[1096] => Array
(
[0] => 323
[1] => 'example string parameter example'
[2] => 172
)
[1097] => )
[1098] => ;
Затем я мог бы перебрать этот массив и заново собрать вызов функции. Но мне не ясно, будут ли такие вещи, как дополнительные аргументы, пробелы и т. Д., Изменять количество элементов массива, составляющих один «полный» вызов функции.
PHP7 теперь позволяет ловить большинство ошибок. Это должно работать:
try {
undefinedfunc('Hello World');
}
catch (Error $e) {
echo "Error caught\n";
}
echo "Reached\n";
Я просто говорю, что вы не хотите упаковывать свои вызовы в блоки try try, но я верю, что это будет правильным способом обработки чего-то подобного.
Я думаю, что хорошей альтернативой для этого будет написание вашего собственного абонента, например так:
function call_and_catch_function($name, $arguments) {
try {
return call_user_func_array($name, $arguments);
}
catch (Error $e) {
// Do something
}
}
Других решений пока нет …