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 ?

7263 次点击
所在节点    PHP
45 条回复
CODEWEA
2020-10-29 13:06:13 +08:00
你用 js 的语法 来推测 php ?这两种语言语法都不一样的
CODEWEA
2020-10-29 13:07:36 +08:00
0 == 'string'
等于
0==(int)('string')
Xusually
2020-10-29 13:19:29 +08:00
老问题了,php 会尝试去转化字符串到数字,看下面的🌰就懂了。
===============================================================================
If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. These rules also apply to the switch statement. The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value.

var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
est
2020-10-29 13:20:03 +08:00
PHP 探测任意网站密码明文 /加密手段办法:md5('240610708') == md5('QNKCDZO')


/t/188364
AngryPanda
2020-10-29 13:21:27 +08:00
想想 '0' == 'string' 吗?
hubqin
2020-10-29 13:34:43 +08:00
之前被 in_array 坑过,要加第三个参数为 true 进行严格比较
des
2020-10-29 13:49:46 +08:00
那你试试 js 的这个 0 == '',脚本语言就是会有很多这种的
yafoo
2020-10-29 14:34:08 +08:00
前段时间,被这个特性坑惨了
Achiii
2020-10-29 14:47:08 +08:00
还有这种坑,下次只用全等
a591826944
2020-10-29 15:15:01 +08:00
@xoxo419 #6 错。。是 非 0 数字开头的字符串
v2yooha
2020-10-29 16:48:38 +08:00
php 的隐式转换,我现在涉及数字类型的判断,都会先把两个参数 is_numeric 一下,都为 true 才执行后续,或者直接用===
v2yooha
2020-10-29 16:50:58 +08:00
@est 这种不都用 hash_equals 了吗
est
2020-10-29 17:48:50 +08:00
@v2yooha 发帖的那个时候还木有。。
lovecy
2020-10-29 18:05:38 +08:00
要么用 empty 判断空值,要么用全等判断,==这种自带各种转换的,了解了规则后再使用
==和===的 Map:php.net/manual/zh/types.comparisons.php
比较和转换优先级:php.net/manual/zh/language.operators.comparison.php#language.operators.comparison.types
zencoding
2020-10-29 18:51:33 +08:00
@xoxo419 "任何字符串"有误,比如 intval("32xxx23");
abcd191898105
2020-10-29 19:12:32 +08:00
所以说 php 就很离谱了,js 的话,就是返回 false 了。来玩 js
fucker
2020-10-30 01:46:38 +08:00
看到标题我就猜到是 == 和 === 的问题了
mostkia
2020-10-30 08:15:19 +08:00
所以我编程已经很少用==了,有些问题并没有答案,就是语言这样设计的,你得踩过无数的坑之后才能算是熟练的使用它。==和===的问题在各种语言中都有自己的解释。一般还是推荐完全等于号===,排除未知的问题。
yc8332
2020-10-30 08:54:27 +08:00
不过类型进行比较。你也是人才了。。php 的特性就是这样,反正也不报错。
xbchaonba
2020-10-30 09:02:52 +08:00
@xoxo419 和大于 0 开头的带数字的字符串比就是 false 了

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

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

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

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

© 2021 V2EX