3

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

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

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

4

7 回答 7

3

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

于 2012-01-03T17:44:12.280 回答
1

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

function somefunction()
{
    return;

    echo 'This will never get displayed';
}
于 2012-01-03T17:43:20.317 回答
1

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

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

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

于 2012-01-03T17:52:24.110 回答
0

由于手动状态break 仅用于循环。

于 2012-01-03T17:44:27.833 回答
0

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

于 2012-01-03T17:52:57.790 回答
0

可以从子函数返回一个特殊的结果,表明一个特定的条件已经满足。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;
}
于 2012-01-03T17:55:52.747 回答
0

是的,您可以非常简单地构建一个“无主体”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

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

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

$return = echo1T() && echo2F() && echo3T();  // outputs: 12
var_export($return);  // outputs false
于 2021-10-29T06:01:35.840 回答