写点什么

谈谈 PHP switch case 和其他语言的区别

  • 2022-10-15
    广东
  • 本文字数:738 字

    阅读完需:约 1 分钟

背景

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

问题描述

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

$fee = 0switch ($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,否则会一直往下匹配,直到找到中断位置结束。

结语

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

发布于: 11 分钟前阅读数: 5
用户头像

还未添加个人签名 2020-06-16 加入

还未添加个人简介

评论

发布
暂无评论
谈谈PHP switch case和其他语言的区别_php_芥末拌个饭吧_InfoQ写作社区