一次PHP switch case理解失误的经历

举报
芥末拌个饭吧 发表于 2022/11/10 14:33:57 2022/11/10
【摘要】 编程语言是相通的,但又有各自的特点和区别。我们在掌握一门语言后,再去学习另一门语言,需要注意一些细节差异。

背景

有个项目需求是要按照业务制定的规则,计算订单的各项费用。因为对接的业务缺少具体文档,因此逻辑只能从业务代码中抽取出来。业务代码是PHP写的,本人是主写python和go的,在代码抽离中,有一个费用字段算出来总是和业务方的对不上,多重排查发现是对PHP switch case的理解偏差。

问题描述

业务switch case处代码简略如下:

$fee = 0
switch ($channel) {
    case "A":
        $fee = 1;
        break;
    case "B":
    case "C":
        $fee = 3;
        break;
    default:
        $fee = 4;
        break;
}

当时看到这段代码,想当然的翻译成:

  • 当channel="A"时, fee=1;
  • 当channel="B"时, fee=0;
  • 当channel="C"时, fee=3;
  • 当channel="D"时, fee=4。

通过实验发现,当channel= A、C、D时,没有问题,但channel="B"时,fee=3。

得出结果后,对于php这种语法很诧异。查阅相关文档才了解到,switch会一直运行代码直到找到中断位置结束。

对比golang switch case

看完php的switch case,我们再来看看golang中的switch case。

channel := "B"
fee := 0 
switch channel {
    case "A":
        fee = 1
    case "B":
    case "C":
        fee = 2
    default:
        fee = 4
}

不同输入结果如下:

  • 当channel="A"时, fee=1;
  • 当channel="B"时, fee=0;
  • 当channel="C"时, fee=3;
  • 当channel="D"时, fee=4。

结果和预期的一致,由此可见golang和php的不同点在于,golang的switch遇到匹配的case后,执行完case内的代码会直接break出来,而php中需要手动break,否则会一直往下匹配,直到找到中断位置结束。

结语

都说各种语言是相通的,但不同语言会有各自的特点。在我们学习及使用不同的语言时,应先弄清楚它的特性,也许会和自己预期的有差别,才能避免出现和文中类似的错误。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。