在 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 循环中打破一个函数? [复制]