首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中:如果找到匹配的案例,是否对其余的case语句进行了评估?

在PHP中:如果找到匹配的案例,是否对其余的case语句进行了评估?
EN

Stack Overflow用户
提问于 2013-10-01 22:20:35
回答 4查看 125关注 0票数 1

我在一个紧循环中有一个开关语句,如下所示:

代码语言:javascript
复制
switch(true) {
    case /*expensive comparison */:
    case /*another expensive comparison */:
    case /*different expensive comparison */:
        return true;
}
return false;

我想看看是否有任何昂贵的比较是正确的,但只有一个。我知道还有其他方法可以做到这一点,但是这个看起来很好,很干净。真正的问题是:如果expensive comparison计算为true,那么它也运行another expensive comparison,还是跳到返回?

编辑:--我意识到这可以用简单的语句来完成,但是现在为了理论的考虑,我想知道。

代码语言:javascript
复制
return /*expensive comparison */
         || /*another expensive comparison */
         || /*different expensive comparison */;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-03 13:09:01

我终于有机会对此进行一些测试,看起来(至少5.4)一旦一次匹配,就会停止对案例的评估。以下是我如何验证的:

代码语言:javascript
复制
<?php
function evaluate($id)
{
    echo $id, "\n";
    return true;
}

switch (true) {
    case evaluate(1):
    case evaluate(2):
    case evaluate(3):
    echo "Evaluated\n";
}

这是输出:

代码语言:javascript
复制
 >1
 >Evaluated
票数 0
EN

Stack Overflow用户

发布于 2013-10-01 22:22:01

是,

他们一直跑到休息的时候。匹配的情况下的所有情况都运行,不管它们是否匹配。

代码语言:javascript
复制
<?php
$i =0;
switch ($i) {
    case 0:
        echo "i equals 0";
    case 1:
        echo "i equals 1";
    case 2:
        echo "i equals 2";
}
?>

会显示所有3个回波,例如

开关语句的设计是为了将1值与许多条件进行比较。所以没有,一旦它有了匹配,它将被优化不再寻找更多。

票数 2
EN

Stack Overflow用户

发布于 2013-10-01 22:23:23

如果不使用中断,PHP将执行所有其他后续案例中的语句,这与案例是否匹配无关:

代码语言:javascript
复制
switch(1)
{
    case 1:
            echo 1;
    case 2:
            echo 2;
    case 3:
            echo 3;

    return 'done';
}

产出: 123

"...PHP继续执行语句,直到开关块结束,或者它第一次看到中断语句。如果您不在case语句列表的末尾写入中断语句,PHP将继续执行以下情况的语句。“

http://php.net/manual/en/control-structures.switch.php

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19126977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档