今天同事遇到类似这样一个坑,先不说 switch 这么混杂是否合适
function test($var)
{
    switch ($var)
    {
        case 'apple':
            echo 'apple', PHP_EOL;
            break;
        case 0:
            echo '0', PHP_EOL;
            break;
        default:
            echo 'default', PHP_EOL;
    }
}
$arr = array('0', 0, 'apple');
foreach ($arr as $value)
{
    test($value);
}
/**
结果
0
apple
apple
**/
字符串和数字比较的时候会把字符串强制转数字,apple 就变成了 0,就相等了...
坑爹啊
(╯‵□′)╯︵┻━┻
|  |      1tomczhen      2017-10-18 22:40:39 +08:00  3 这是 Feature 不是 Bug。:doge: | 
|  |      2blankme      2017-10-18 22:53:56 +08:00 不同类型的东西为什么要比较 | 
|      3ysoserious      2017-10-18 23:08:15 +08:00  1 写 PHP 的时候有个习惯就是外部获取的数据先进行一次强制的类型转换,然后再用。 | 
|  |      4takanasi      2017-10-18 23:11:18 +08:00 py 大法好 >>> 'apple'==0 False | 
|      5seognilV2      2017-10-19 00:23:46 +08:00 via Android 这叫隐式类型转换 | 
|  |      6wintercoder      2017-10-19 01:07:12 +08:00 这几天也刚遇到  echo "aa" == 0; 是 true | 
|      7bazingaterry      2017-10-19 02:02:27 +08:00 via iPhone 嚇了我一跳 - - | 
|      8onlyhot      2017-10-19 02:10:18 +08:00 via iPhone  4 既然你们写 php,为什么你们连这点基础知识都没有?还敢吐槽这是坑? | 
|  |      9changwei      2017-10-19 05:34:29 +08:00 via Android  1 楼主再去写一下 javascript 估计会发现更多神奇的事情 | 
|  |      10Tunar      2017-10-19 07:58:32 +08:00 via Android  2 你是 c131-2 还是 c64-1 的莫蒂? | 
|  |      11sagaxu      2017-10-19 08:06:34 +08:00 via Android 好吧,我也掉坑里了。php 和 js 是主流语言里语法设计最垃圾的。 | 
|      12simapple      2017-10-19 08:19:38 +08:00 同一楼,这是特性 | 
|  |      13askfilm      2017-10-19 08:29:18 +08:00  1 有 === 不用,   有着 php 的便利,还吐槽着, 唉~ | 
|      14dobelee      2017-10-19 08:30:56 +08:00 via Android 不同类型的东西不要比较,相似的问题还有 false 和 0 的问题。 | 
|  |      15fzhw88      2017-10-19 08:44:12 +08:00 via Android 这是语言特性,说人家设计垃圾的也是无语。 | 
|  |      16k9982874      2017-10-19 09:03:48 +08:00 via iPhone 这种 case 不是应该用 if ? | 
|  |      17byfar      2017-10-19 09:20:28 +08:00 "先不说 switch 这么混杂是否合适" "混杂" 的情况你就不能这么用!同类型没问题,语言特性使然。 "混杂" 的情况下不想 PHP 帮你自动转换,那就需要你使用全等,修改如下: ``` php function test($var) { switch (true) { case 'apple' === $var: echo 'apple', PHP_EOL; break; case 0 === $var: echo '0', PHP_EOL; break; default: echo 'default', PHP_EOL; } } ``` | 
|  |      18WytheHuang      2017-10-19 09:29:51 +08:00 > 注意 switch/case 作的是松散比较。 > 因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换 http://php.net/manual/zh/control-structures.switch.php http://php.net/manual/zh/language.types.string.php#language.types.string.conversion 手册都写好了, 踩坑不要怪 PHP | 
|  |      19ioth      2017-10-19 09:33:18 +08:00 初级问题中的 2 级问题 | 
|      20MushishiXian      2017-10-19 09:44:03 +08:00 多看 php 官方文档.... | 
|  |      21sagaxu      2017-10-19 09:57:36 +08:00 via Android  2 火锅店自助调料区,一个装屎的容器上用粗体写着醒目的一个大字,屎。提示写的很清楚了,是你自己没看清楚,所以这是特性,不要吐槽。 | 
|  |      22b821025551b      2017-10-19 10:03:38 +08:00 先不说 switch 这么混杂是否合适 ❌ switch 这么混杂就是不合适⭕️ | 
|  |      23yxn1910      2017-10-19 10:08:23 +08:00 关于弱类型语言的 PHP 对数字和字符串进行比较时会发生什么事情应该是刚入门第一个月就该掌握的一个知识点,正确的姿势是再买一本基础书好好边做笔记边看完而不是来 v 站吐槽。 | 
|  |      24Norie      2017-10-19 10:59:11 +08:00 这不是很正常吗? | 
|  |      25sucaihuo      2017-10-19 11:03:26 +08:00 来学习一下 | 
|  |      26iyaozhen      2017-10-19 11:16:18 +08:00 via Android 多看文档。有抱怨的时间还不如把这块再深入看下。比如字符串隐式转 int 的规则是怎么样的 | 
|      27zgx030030      2017-10-19 11:44:12 +08:00 你写 PHP 的 都不懂它的字符串和数值比较时的类型转换,也难怪 php 会被黑。 | 
|  |      28Alex6      2017-10-19 11:56:29 +08:00 还是规避这种 case 比较写法吧,可以考虑用这个 strcmp 比较,类型自动转换为 string | 
|  |      30haierspi      2017-10-19 15:34:07 +08:00 很奇怪的写法... 给我的感觉就是一边吃雪糕 一边吃火锅... | 
|  |      31haierspi      2017-10-19 15:35:51 +08:00 建议还是 写 if elseif  用 === 来判断更为准确.. 不然就会出现 PHP 自动转换类型 | 
|  |      32hheedat OP 大家说的都很有道理,谢谢了 | 
|  |      33gouchaoer      2017-10-19 21:48:04 +08:00 via Android 你的观点在于 switch 匹配用了==而为何不用===的问题,实际上这个问题很简单,当你从用户输入或者数据库读出的数据都是 string,很多时候你根本不知道一个变量是 int 还是 string,这个时候就觉得这么做有合理性 | 
|  |      35gouchaoer      2017-10-19 21:52:01 +08:00 via Android go 的语法也是屎 老实按照 java/c 的惯例来多好,非要特立独行 | 
|  |      36cncqw      2017-10-19 22:16:31 +08:00 楼主基础不好还像发现新大陆一样 | 
|      37hard2reg      2017-10-20 02:35:17 +08:00 这个坑。。我踩过 | 
|  |      38mol310      2017-10-20 09:38:32 +08:00 php 是世界上最好的语言 ^0^ | 
|  |      398355      2017-10-20 13:40:14 +08:00 多年前在 segmentfault 上提过这个问题 http://php.net/manual/zh/types.comparisons.php | 
|      40carlclone      2017-10-20 14:32:26 +08:00 via Android php 被鄙视多亏了楼主这种人基数过大 | 
|  |      41jevonszmx      2017-10-20 19:26:30 +08:00 @carlclone  哎,最近看论坛,发现真的 PHP 被鄙视,好多很业余的问题,都赖在 php 身上。。。 php 官方文档写的非常非常清楚: http://php.net/manual/zh/control-structures.switch.php Note: 注意 switch/case 作的是松散比较。 http://php.net/manual/zh/types.comparisons.php#types.comparisions-loose 官方手册真的要常读~ |