使用 "switch(true)" 代替大量if

最近研究 Laravel 时发现有个写法是 switch(true), 就稍微研究了一下

这里假设我们有一个商场折扣程序

大于5件给0.9折
大于10件给0.8折

传统写法
function sumDiscount($count) {
    if ($count > 10) {
        return 0.8;
    } else if ($count > 5) {
        return 0.9;
    } else {
        return 1;
    }
}

echo sumDiscount(4); //1
echo sumDiscount(8); //0.9
echo sumDiscount(12); //0.8
switch写法
function sumDiscount($count) {
    switch(true) {
        case $count > 10:
            return 0.8;
        case $count > 5:
            return 0.9;
        default:
            return 1;
    }
}

echo sumDiscount(4); //1
echo sumDiscount(8); //0.9
echo sumDiscount(12); //0.8

甚至也可以反着写

function sumDiscount($count) {
    switch(false) {
        case $count < 10:
            return 0.8;
        case $count < 5:
            return 0.9;
        default:
            return 1;
    }
}

echo sumDiscount(4); //1
echo sumDiscount(8); //0.9
echo sumDiscount(12); //0.8

这样写的话个人认为结构层次更清晰了 (?)

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 5
李铭昕

代码是不是有点问题?不加break么??😂

3年前 评论

这样写的好处是什么呢,感觉不出来

3年前 评论

@究极管理员

个人认为结构层次更清晰了(?)

3年前 评论

@李铭昕 加了break就会在第一个case结束

例子:

<?php
$a = 0;
switch (true) {
    case 5 < 8:
        $a++;
    case 5 < 10:
        $a++;
}

echo $a; // 2
?>

如果加上了break则$a就永远是1

3年前 评论
渣渣120 (作者) (楼主) 3年前
李铭昕 3年前
李铭昕 3年前

嗯,感觉结构更清晰了些

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!