神奇的 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 条回复
sagaxu
2017-10-19 09:57:36 +08:00
火锅店自助调料区,一个装屎的容器上用粗体写着醒目的一个大字,屎。提示写的很清楚了,是你自己没看清楚,所以这是特性,不要吐槽。
b821025551b
2017-10-19 10:03:38 +08:00
先不说 switch 这么混杂是否合适 ❌
switch 这么混杂就是不合适⭕️
yxn1910
2017-10-19 10:08:23 +08:00
关于弱类型语言的 PHP 对数字和字符串进行比较时会发生什么事情应该是刚入门第一个月就该掌握的一个知识点,正确的姿势是再买一本基础书好好边做笔记边看完而不是来 v 站吐槽。
Norie
2017-10-19 10:59:11 +08:00
这不是很正常吗?
sucaihuo
2017-10-19 11:03:26 +08:00
来学习一下
iyaozhen
2017-10-19 11:16:18 +08:00
多看文档。有抱怨的时间还不如把这块再深入看下。比如字符串隐式转 int 的规则是怎么样的
zgx030030
2017-10-19 11:44:12 +08:00
你写 PHP 的 都不懂它的字符串和数值比较时的类型转换,也难怪 php 会被黑。
Alex6
2017-10-19 11:56:29 +08:00
还是规避这种 case 比较写法吧,可以考虑用这个 strcmp 比较,类型自动转换为 string
FYK
2017-10-19 15:25:27 +08:00
@sagaxu 无关其他 ,只是觉得这个例子太好笑了。哈哈哈哈哈火锅店自助调料区放着一容器的屎 哈哈哈哈哈
haierspi
2017-10-19 15:34:07 +08:00
很奇怪的写法... 给我的感觉就是一边吃雪糕 一边吃火锅...
haierspi
2017-10-19 15:35:51 +08:00
建议还是 写 if elseif 用 === 来判断更为准确.. 不然就会出现 PHP 自动转换类型
hheedat
2017-10-19 19:01:08 +08:00
大家说的都很有道理,谢谢了
gouchaoer
2017-10-19 21:48:04 +08:00
你的观点在于 switch 匹配用了==而为何不用===的问题,实际上这个问题很简单,当你从用户输入或者数据库读出的数据都是 string,很多时候你根本不知道一个变量是 int 还是 string,这个时候就觉得这么做有合理性
gouchaoer
2017-10-19 21:49:32 +08:00
@sagaxu 我不同意,php 语法规规矩矩,py 的语法才是屎
gouchaoer
2017-10-19 21:52:01 +08:00
go 的语法也是屎
老实按照 java/c 的惯例来多好,非要特立独行
cncqw
2017-10-19 22:16:31 +08:00
楼主基础不好还像发现新大陆一样
hard2reg
2017-10-20 02:35:17 +08:00
这个坑。。我踩过
mol310
2017-10-20 09:38:32 +08:00
php 是世界上最好的语言 ^0^
8355
2017-10-20 13:40:14 +08:00
多年前在 segmentfault 上提过这个问题
http://php.net/manual/zh/types.comparisons.php
carlclone
2017-10-20 14:32:26 +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