Любой способ выйти из внешней функции изнутри внутренней функции? - PullRequest
6 голосов
/ 21 апреля 2011

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

Кто-нибудьесть совет?

Ответы [ 4 ]

1 голос
/ 21 апреля 2011

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

0 голосов
/ 21 апреля 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.

0 голосов
/ 21 апреля 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');
?>
0 голосов
/ 21 апреля 2011
<?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!');
  }
?>
...