#php #wordpress #action #exit
#php #wordpress #Экшен #выход
Вопрос:
В PHP, если у меня есть одна функция, которая вызывает другую функцию; есть ли какой-либо способ заставить вызываемую функцию выйти из вызывающей функции, не уничтожая весь скрипт?
Например, допустим, у меня есть некоторый код, что-то вроде:
<?php
function funcA() {
funcB();
echo 'Hello, we finished funcB';
}
function funcB() {
echo 'This is funcB';
}
?>
<p>This is some text. After this text, I'm going to call funcA.</p>
<p><?php funcA(); ?></p>
<p>This is more text after funcA ran.</p>
К сожалению, если я нахожу что-то внутри funcB, что заставляет меня хотеть остановить завершение работы funcA, мне, похоже, придется завершить весь PHP-скрипт. Есть ли какой-нибудь способ обойти это?
Я понимаю, что мог бы написать что-нибудь в funcA (), чтобы проверить результат из funcB (), но, в моем случае, я не имею никакого контроля над содержимым funcA(); у меня есть контроль только над содержимым funcB ().
Чтобы сделать этот пример немного более конкретным; в данном конкретном случае я работаю с WordPress. Я подключаюсь к функции get_template_part() и пытаюсь остановить WordPress от фактического запроса / включения файла через функцию locate_template (), которая вызывается после выполнения моего подключения.
У кого-нибудь есть какие-нибудь советы?
Комментарии:
1. Я также предлагаю спросить, что вы хотите сделать на WP. Может быть, есть функция или wp_filter, которую вы можете использовать вместо этого. Я бы спросил здесь и на wordpress.stackexchange.com сайт.
Ответ №1:
Генерирует исключение в funcB
, которое не обрабатывается в funcA
Комментарии:
1. Хотя злоупотребление исключениями для управления потоком является злом .
Ответ №2:
<?php
function funcA() {
try
{
funcB();
echo 'Hello, we finished funcB';
}
catch (Exception $e)
{
//Do something if funcB causes an error, or just swallow the exception
}
}
function funcB() {
echo 'This is funcB';
//if you want to leave funcB and stop funcA doing anything else, just
//do something like:
throw new Exception('Bang!');
}
?>
Комментарии:
1. Спасибо за попытку, но, как я уже говорил в своем первоначальном посте, у меня нет контроля над кодом, из которого состоит funcA (), поэтому я не смог бы поместить оператор try / catch внутрь этой функции.
2. Затем вы могли бы обернуть свой вызов funcA () в обработчик исключений.
Ответ №3:
Единственный способ, который я вижу, — это использование исключений:
function funcA() {
funcB();
echo 'Hello, we finished funcB';
}
function funcB() {
throw new Exception;
echo 'This is funcB';
}
?>
<p>This is some text. After this text, I'm going to call funcA.</p>
<p><?php try { funcA(); } catch (Exception $e) {} ?></p>
<p>This is more text after funcA ran.</p>
Некрасиво, но это работает в PHP5.
Комментарии:
1. Спасибо за совет. Я должен быть в состоянии заставить это работать за меня. Я вроде как надеялся выполнить это без необходимости редактировать какие-либо файлы шаблонов (куда мне пришлось бы поместить инструкцию try / catch), но это хорошая информация на будущее.
Ответ №4:
Возможно…
Это не решение, но вы могли бы подключить другую функцию, которая вызывается при запросе exit() «register_shutdown_function(‘shutdown’);». И чтобы каким-то образом заставить это все снова продолжаться или завершаться к вашему удовлетворению.
<?php
function shutdown()
{
// This is our shutdown function, in
// here we can do any last operations
// before the script is complete.
echo 'Script executed with success', PHP_EOL;
}
register_shutdown_function('shutdown');
?>