代码片段中有一段代码是这样的
$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 ?
![]() | 1 puzzle9 2020-10-29 10:41:23 +08:00 ![]() 先了解下 == 和 === 区别 再说这个 |
![]() | 2 krabs OP @puzzle9 所以=== 和上面的对比有什么关系 === 是带类型对比 int 肯定不和 string 成立 但是问题是 == 不论是值 还是类型 都不成立 怎么返回 true |
![]() | 3 jowan 2020-10-29 10:45:08 +08:00 ![]() |
![]() | 5 Chappako 2020-10-29 10:48:07 +08:00 ![]() 0 是 int,"string" 想要和 0 比较,就要先转换成 int,你自己试试 intval('string') |
![]() | 6 xoxo419 2020-10-29 10:48:23 +08:00 ![]() |
![]() | 7 devwolf 2020-10-29 10:48:58 +08:00 #3 学到了 |
![]() | 8 jay4497 2020-10-29 10:49:16 +08:00 脚本类语言存在很多类型隐式转换的,真要比就用 `===` |
![]() | 9 jowan 2020-10-29 10:49:35 +08:00 很多语法是不能相并论的 比如 js 的 'string' || false 如果你对 PHP 或者 JS 不太熟悉 最好是快速看下他的基础语法 有很多看似类似却又不同的东西 |
![]() | 10 eason1874 2020-10-29 10:49:53 +08:00 PHP == 不是说不带类型比较,== 是先转换类型再比较。 数字比较字符串,字符串先被转换成数字,才进行比较。 0=='string' 等于 0==0 所以是 true |
11 impl 2020-10-29 10:50:32 +08:00 ![]() 解释器看到 0 ==,知道你要对比的是数值,所以就把后面的东西解析为数值,而'string'只能解析成数字 0 |
![]() | 12 GuangXiN 2020-10-29 10:51:06 +08:00 via Android ![]() 因为 int == string 会触发自动类型转换,PHP 会把所有非数值字符串转换为 0 。 尝试 var_dump((int) 'abc'); |
![]() | 13 kuro1 2020-10-29 10:54:12 +08:00 好的 IDE 会提示你是否要用 === |
![]() |
![]() | 17 avenger 2020-10-29 10:57:50 +08:00 via iPhone 永远不要用 ==,可以加一个 php-cs-fix 自动修复 |
![]() | 18 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 就一致了 |
![]() | 19 keepeye 2020-10-29 11:06:09 +08:00 另外多嘴一句,使用 == 比较不同类型的变量是不负责任的行为,应当避免 |
![]() | 20 imdong 2020-10-29 12:37:38 +08:00 ![]() intval($p) == (int) $p |
21 CODEWEA 2020-10-29 13:06:13 +08:00 你用 js 的语法 来推测 php ?这两种语言语法都不一样的 |
22 CODEWEA 2020-10-29 13:07:36 +08:00 0 == 'string' 等于 0==(int)('string') |
![]() | 23 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 |
![]() | 24 est 2020-10-29 13:20:03 +08:00 ![]() |
![]() | 25 AngryPanda 2020-10-29 13:21:27 +08:00 想想 '0' == 'string' 吗? |
26 hubqin 2020-10-29 13:34:43 +08:00 via Android 之前被 in_array 坑过,要加第三个参数为 true 进行严格比较 |
![]() | 27 des 2020-10-29 13:49:46 +08:00 那你试试 js 的这个 0 == '',脚本语言就是会有很多这种的 |
![]() | 28 yafoo 2020-10-29 14:34:08 +08:00 via Android 前段时间被这个特性坑惨了 |
29 Achiii 2020-10-29 14:47:08 +08:00 还有这种坑,下次只用全等 |
![]() | 30 a591826944 2020-10-29 15:15:01 +08:00 @xoxo419 #6 错。。是 非 0 数字开头的字符串 |
![]() | 31 v2yooha 2020-10-29 16:48:38 +08:00 php 的隐式转换,我现在涉及数字类型的判断,都会先把两个参数 is_numeric 一下,都为 true 才执行后续,或者直接用=== |
![]() | 34 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 |
![]() | 36 abcd191898105 2020-10-29 19:12:32 +08:00 所以说 php 就很离谱了,js 的话,就是返回 false 了。来玩 js |
![]() | 37 fucker 2020-10-30 01:46:38 +08:00 |
![]() | 38 mostkia 2020-10-30 08:15:19 +08:00 所以我编程已经很少用==了,有些问题并没有答案,就是语言这样设计的,你得踩过无数的坑之后才能算是熟练的使用它。==和===的问题在各种语言中都有自己的解释。一般还是推荐完全等于号===,排除未知的问题。 |
39 yc8332 2020-10-30 08:54:27 +08:00 不过类型进行比较。你也是人才了。。php 的特性就是这样,反正也不报错。 |
![]() | 41 fuxkcsdn 2020-10-30 09:24:49 +08:00 我项目里,除非一些极其特殊的情况(必须加注释),谁敢用 == 进行判断,会被我拉来骂的 |
![]() | 42 no1xsyzy 2020-10-30 10:58:41 +08:00 @xbchaonba '0' == '1e-10000000000000000' 1 开头,带数字,比较结果为 true https://tio.run/##K8go@P/fxr4go0ChLLEoPqU0t0BD3UBdwdZWQd0wVdfQAA2oa1or2Nv9/w8A |
43 qq1340691923 2020-10-30 11:22:59 +08:00 世界上最好的语言 |
45 hbolive 2020-11-28 14:51:49 +08:00 楼主好消息来了,PHP8 运行结果应该是 false 。。 在 PHP8 中,数字和字符比较,会首先把数字转换成字符,再比较。我也觉得这样会比较科学。。 |