神奇的 PHP 数字和字符串比较

2017-10-18 22:36:01 +08:00
 hheedat

今天同事遇到类似这样一个坑,先不说 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,就相等了...

坑爹啊

(╯‵□′)╯︵┻━┻

6552 次点击
所在节点    PHP
41 条回复
tomczhen
2017-10-18 22:40:39 +08:00
这是 Feature 不是 Bug。:doge:
blankme
2017-10-18 22:53:56 +08:00
不同类型的东西为什么要比较
ysoserious
2017-10-18 23:08:15 +08:00
写 PHP 的时候有个习惯就是外部获取的数据先进行一次强制的类型转换,然后再用。
takanasi
2017-10-18 23:11:18 +08:00
py 大法好
>>> 'apple'==0
False
seognilV2
2017-10-19 00:23:46 +08:00
这叫隐式类型转换
wintercoder
2017-10-19 01:07:12 +08:00
这几天也刚遇到
echo "aa" == 0; 是 true
bazingaterry
2017-10-19 02:02:27 +08:00
嚇了我一跳 - -
onlyhot
2017-10-19 02:10:18 +08:00
既然你们写 php,为什么你们连这点基础知识都没有?还敢吐槽这是坑?
changwei
2017-10-19 05:34:29 +08:00
楼主再去写一下 javascript 估计会发现更多神奇的事情
Tunar
2017-10-19 07:58:32 +08:00
你是 c131-2 还是 c64-1 的莫蒂?
sagaxu
2017-10-19 08:06:34 +08:00
好吧,我也掉坑里了。php 和 js 是主流语言里语法设计最垃圾的。
simapple
2017-10-19 08:19:38 +08:00
同一楼,这是特性
askfilm
2017-10-19 08:29:18 +08:00
有 === 不用, 有着 php 的便利,还吐槽着, 唉~
dobelee
2017-10-19 08:30:56 +08:00
不同类型的东西不要比较,相似的问题还有 false 和 0 的问题。
fzhw88
2017-10-19 08:44:12 +08:00
这是语言特性,说人家设计垃圾的也是无语。
k9982874
2017-10-19 09:03:48 +08:00
这种 case 不是应该用 if ?
byfar
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;
}
}
```
WytheHuang
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
ioth
2017-10-19 09:33:18 +08:00
初级问题中的 2 级问题
MushishiXian
2017-10-19 09:44:03 +08:00
多看 php 官方文档....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/398773

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX