Любой способ выйти из внешней функции из внутренней функции?

В 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(), которая вызывается после выполнения моего хука.

Есть ли у кого-нибудь совет?


person cgrymala    schedule 21.04.2011    source источник
comment
Я также предлагаю спросить, что вы хотите делать на WP. Возможно, вместо этого вы можете использовать функцию или wp_filter. Я бы спросил здесь и на сайте wordpress.stackexchange.com.   -  person Oscar Godson    schedule 21.04.2011


Ответы (4)


Создать исключение в funcB, которое не обрабатывается в funcA

person AJ.    schedule 21.04.2011
comment
Хотя злоупотребление исключениями для управления потоком — это зло. - person ; 21.04.2011

Единственный способ, который я вижу, это использование исключений:

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.

person meze    schedule 21.04.2011
comment
Спасибо за совет. Я должен быть в состоянии сделать эту работу для меня. Я как бы надеялся сделать это без необходимости редактировать какие-либо файлы шаблонов (именно там мне пришлось бы поместить оператор try/catch), но это хорошая информация на будущее. - person cgrymala; 22.04.2011

Может быть...

Это не решение, но вы можете перехватить другую функцию, которая вызывается при запросе 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');
?>
person Ekim    schedule 21.04.2011

person    schedule
comment
Спасибо за попытку, но, как я уже говорил в своем исходном посте, у меня нет контроля над кодом, составляющим funcA(), поэтому я не смог бы поместить оператор try/catch внутрь этой функции. - person cgrymala; 22.04.2011
comment
Затем вы можете обернуть свой вызов funcA() в обработчик исключений. - person Steve Mayne; 22.04.2011