zoco

php Switch的一个注意点

2018-07-23


    public function formatTime($timestamp) {
        $now = time();
        $diff = $now - $timestamp;
        switch ($diff) {
            case $diff < 60:
                $re = '1分钟';
                break;
            case $diff < 60 * 60:
                $re = strval(intval($diff / 60)) . '分钟';
                break;
            case $diff < 60 * 60 * 48:
                $re = strval(intval($diff / (60 * 60))) . '小时';
                break;
            default:
                $re = strval(intval($diff / (60 * 60 * 24))) . '天';
                break;
        }

        return $re;
    }

当时间戳是time()的时候,diff为0,想的得到的结果应该是返回1分钟,结果却返回了0天。

问题的原因就是switch case在执行的流程是 switch 位置的条件和 case 位置的条件做比较,再继续执行程序。

a.当$diff大于0时,switch位置的条件为“真” true,然后用true 和 case 位置的条件作比较。这时程序是没有问题的,因为只要case位置的条件为true语句就跳出了。

b.当$diff等于0时,就需要主要了。这个时候switch位置的条件为“假” false,语句继续执行的时候,只有当 case 位置的条件也为false 程序才会执行 case 冒号位置后的程序。而事实是 case 位置的所有调教都为“真”,所以最终的结果是执行default冒号后的语句。

这种情况将switch($diff)变为switch(true)就好了