在 PHP 中打破多个函数(短路)

Posted

技术标签:

【中文标题】在 PHP 中打破多个函数(短路)【英文标题】:Breaking out of multiple functions (short circuiting) in PHP 【发布时间】:2012-02-01 17:37:09 【问题描述】:

我想在 php 中返回多个嵌套函数。可以通过在“break”之后添加一个数字来打破多个循环。例如。

while(1)
  while(1)
    while(1)
      break 3;

我可以在调用一系列函数时进行断路吗?

【问题讨论】:

【参考方案1】:

是的,您可以非常简单地构造一个“无主体”while()if() 块。通常,您会看到符合 PSR-12 的 PHP 代码使用 来结束循环/条件块的主体,但主体不是必需的。在行尾写一个分号就足够了,您的 IDE 不会抱怨语法错误。

从每个函数返回一个真实值将足以表明以下函数已被授权执行。

这将提供所需的“短路”功能,而无需创建嵌套控制结构或将变量传递到不同的范围。

我将用一系列通用函数进行演示:

function echo1T() 
    echo "1";
    return true;

function echo2T() 
    echo "2";
    return true;

function echo3T() 
    echo "3";
    return true;

function echo1F() 
    echo "1";
    return false;

function echo2F() 
    echo "2";
    return false;

function echo3F() 
    echo "3";
    return false;

代码:(Demo with more scenarios)

while (echo1T() && echo2F() && echo3T());  // outputs: 12

if (echo1T() && echo2F() && echo3T()); // outputs: 12

$return = echo1T() && echo2F() && echo3T();  // outputs: 12
var_export($return);  // outputs false

【讨论】:

【参考方案2】:

可以从子函数返回一个特殊的结果,表明一个特定的条件已经满足。 WordPress 使用 WP_Error 和 is_wp_error() 进行此类操作。任意数量的嵌套函数都可以检查被调用函数是否返回错误状态,并选择将该错误向上传递而不是继续处理。

例子:

function outer() 
    $result = inner();

    // pass failure back to parent
    if( is_wp_error($result) ) 
        return $result;
    

    // other processing

    return $final_result;


function inner() 
    if( some_condition() ) 
        // generate an error
        return new WP_Error( 'code', 'message' );
    

    return $other_result;


$result = outer();

// did we get an error?
if( is_wp_error($result) ) 
    echo 'Something went wrong.';
 else 
    echo $result;

【讨论】:

【参考方案3】:

在这种情况下我所做的是有一个异常返回值(或对象)并在每个函数返回点对返回值进行值检查,以确保情况得到适当传播或处理,但在进行递归时要小心,您可能会错误地完全折叠树....顺便说一句,如果它是在错误情况下的简单退出,您也可以使用异常。

【讨论】:

【参考方案4】:

另一种解决方案是为每个时间添加一个条件。

while(1 && $isTrue)
  while(1 && $isTrue)
    while(1 && $isTrue)
      $isTrue = false;
      break;

虽然我不认为这是一个非常干净的方法。

【讨论】:

【参考方案5】:

As the manual states break 仅用于循环。

【讨论】:

【参考方案6】:

据我所知,它的设计也不是很健康,因为相关的父函数和祖父函数永远不会知道中断。您应该抛出一个异常并在父级上捕获它,而父级又会抛出一个异常并在祖父级等上捕获它。

【讨论】:

【参考方案7】:

要“打破”功能,您可以使用return

function somefunction()

    return;

    echo 'This will never get displayed';

【讨论】:

是的,但您不能按照 Linksku 的要求从多个功能返回。

以上是关于在 PHP 中打破多个函数(短路)的主要内容,如果未能解决你的问题,请参考以下文章

我将如何在 python 的 while 循环中打破一个函数? [复制]

Python打破内部函数[重复]

php函数中,多个参数的情况下怎么使其中一个参数为默认值而其他的使用指定值

如何将多个 PHP 变量传递给 jQuery 函数?

如何打破函数外部的保护语句?

Jquery:如何打破 each() 和它在里面的函数?