【问题标题】:Any way to exit outer function from within inner function?有什么方法可以从内部函数中退出外部函数?
【发布时间】:2011-08-10 11:36:44
【问题描述】:

在 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。我正在连接the get_template_part() function,并试图阻止 WordPress 通过在我的钩子执行后调用的 locate_template() 函数实际要求/包含文件。

有人有什么建议吗?

【问题讨论】:

  • 我还建议询问您想在 WP 上做什么。也许您可以使用一个函数或 wp_filter 来代替。我会在这里和 wordpress.stackexchange.com 网站上问。

标签: php wordpress action exit


【解决方案1】:

funcB 中抛出一个exception,在funcA 中没有处理

【讨论】:

  • 虽然滥用流控异常是邪恶的
【解决方案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!');
  }
?>

【讨论】:

  • 感谢您的尝试,但是,正如我在原始帖子中所说,我无法控制构成 funcA() 的代码,因此我无法放置 try/catch该函数内部的语句。
  • 然后你可以在异常处理程序中包装你对 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 中可以工作。

【讨论】:

  • 感谢您的提示。我应该能够为我完成这项工作。我有点希望无需编辑任何模板文件(这是我必须放置 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');
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多