Есть ли способ выйти из внешней функции из внутренней функции?

#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');
?>