PHP 的迷惑行为 0 == 'string' 为什么返回 true?

2020-10-29 10:39:32 +08:00
 krabs

代码片段中有一段代码是这样的

$p = 'auto';
if(intval($p) == $p){  // 0 == 'auto'
	...   结果这个条件居然是成立的?
}

然后我通过

var_dump(
	intval($width) == $width,
	0=='auto1',
	0=='string',
	intval($width),
	$width
);

结果返回

bool(true)
bool(true)
bool(true)
int(0)
string(4) "auto"
bool(false)

然后我又去 Js 控制台试了一下 0 == 'string' 返回的是 false

为什么 int 0 会等于 string ?

7009 次点击
所在节点    PHP
45 条回复
puzzle9
2020-10-29 10:41:23 +08:00
先了解下 == 和 === 区别
再说这个
krabs
2020-10-29 10:44:18 +08:00
@puzzle9 所以=== 和上面的对比有什么关系 === 是带类型对比 int 肯定不和 string 成立
但是问题是 == 不论是值 还是类型 都不成立 怎么返回 true
jowan
2020-10-29 10:45:08 +08:00
puzzle9
2020-10-29 10:47:15 +08:00
@krabs 这就牵扯到 php 是世界上最好的语言 设计的哲学了
楼上那个官方文档可以瞅瞅
Chappako
2020-10-29 10:48:07 +08:00
0 是 int,"string" 想要和 0 比较,就要先转换成 int,你自己试试 intval('string')
xoxo419
2020-10-29 10:48:23 +08:00
0 与任何字符串进行 == 比较时都为 true

查阅的文章: https://www.cnblogs.com/weiyalin/p/10388167.html
devwolf
2020-10-29 10:48:58 +08:00
#3 学到了
jay4497
2020-10-29 10:49:16 +08:00
脚本类语言存在很多类型隐式转换的,真要比就用 `===`
jowan
2020-10-29 10:49:35 +08:00
很多语法是不能相并论的 比如 js 的 'string' || false
如果你对 PHP 或者 JS 不太熟悉 最好是快速看下他的基础语法
有很多看似类似却又不同的东西
eason1874
2020-10-29 10:49:53 +08:00
PHP == 不是说不带类型比较,== 是先转换类型再比较。

数字比较字符串,字符串先被转换成数字,才进行比较。

0=='string' 等于 0==0 所以是 true
impl
2020-10-29 10:50:32 +08:00
解释器看到 0 ==,知道你要对比的是数值,所以就把后面的东西解析为数值,而'string'只能解析成数字 0
GuangXiN
2020-10-29 10:51:06 +08:00
因为 int == string 会触发自动类型转换,PHP 会把所有非数值字符串转换为 0 。

尝试 var_dump((int) 'abc');
kuro1
2020-10-29 10:54:12 +08:00
好的 IDE 会提示你是否要用 ===
duhui
2020-10-29 10:54:38 +08:00
@xoxo419
php > var_dump(0 == '1aaa');
php shell code:1:
bool(false)
hhf
2020-10-29 10:56:07 +08:00
@xoxo419 老老实实看官方文档吧,兄弟

var_dump(1 == '2');
hhf
2020-10-29 10:57:09 +08:00
@hhf var_dump(0 == '2')
avenger
2020-10-29 10:57:50 +08:00
永远不要用 ==,可以加一个 php-cs-fix 自动修复
keepeye
2020-10-29 11:04:58 +08:00
先了解下动态语言,类型不一致时是如何比较的吧
同样是将 str 转成 int 再比较,只是 js 和 php 的转换逻辑不一样

php:
0 == 'auto1' -> 0 == int('auto1') -> 0 == 0 // true
js:
0 == 'auto1' -> 0 == parseInt('auto1') --> 0 == NaN // false

你再试试这个 123 == '123aaaaa' ,js 和 php 就一致了
keepeye
2020-10-29 11:06:09 +08:00
另外多嘴一句,使用 == 比较不同类型的变量是不负责任的行为,应当避免
imdong
2020-10-29 12:37:38 +08:00
intval($p) == (int) $p

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

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

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

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

© 2021 V2EX