项目需要, 刚学用PHP, 发现了个奇怪的问题, 有人能解释一下为什么吗?
$str = "aaaa";
if($str == 0) {
echo ('What the fuck'); // 为什么在这里?
} else {
echo ('I wanna it');
}
1
b821025551b 2015-07-16 12:16:37 +08:00
字符“aaaa”对应类型为false;
0对应类型为false; false===false |
2
wy315700 2015-07-16 12:18:33 +08:00
==不检查类型
===会检查类型 |
3
lincanbin 2015-07-16 12:20:31 +08:00
弱类型语言的隐式转换,string和int不能直接比较,所以实际上发生的是:
$str = "aaaa"; if(intval($str) == 0) { echo ('What the fuck'); // 为什么在这里? } else { echo ('I wanna it'); } 实际上发生了隐式转换,如果不需要这个特性,你可以这么写: $str = "aaaa"; if($str === 0) { echo ('What the fuck'); // 为什么在这里? } else { echo ('I wanna it'); } |
4
samael OP lua javascript python 这样的弱类型语言在对比 str == 0 全返回的是false
我是想知道php为什么会这样处理 |
5
arzusyume 2015-07-16 12:42:53 +08:00
js里"aaaa"转Number是NaN,
php里intval的结果就是0 用 == 不是好习惯, 应该明确类型后使用 === |
6
xdazz 2015-07-16 13:14:36 +08:00
|
8
iyaozhen 2015-07-16 13:43:12 +08:00 via Android
比较的时候会有类型转换,字符串转化成int时会看字符串的第一个字符,如果第一个不是数字的话就变成0了。
你改成"1aaa" 就不相等了 |
9
lijinma 2015-07-16 13:48:34 +08:00
Psy Shell v0.3.3 (PHP 5.5.13 — cli) by Justin Hileman
>>> 'aaaa' == false => false >>> 'aaaa' == 0 => true >>> false == 0 => true |
10
123123 2015-07-16 15:58:22 +08:00
1L 这理论从哪个语言来的
|
11
realpg 2015-07-16 20:17:53 +08:00
PHP的==跟判断机制变量类型有关
当一个字符串去跟数字==的时候,首先会把字符串转成数字,等效隐式对字符串使用intval() 然后你去查intval的处理特性,是从左往右找可转换为int的串,遇到不可转换的非法字符后忽略后面的所有字符。 而且intval保证返回的是一个int类型的数字,所以异常的输入(比如从头开始就第一个字符就不能合法转换的)返回的就是0 |
12
doushiyinweini 2015-07-16 21:27:59 +08:00
var_dump( 2 == "2b" ); // 有人说你2,其实就是说你2b的意思 所以 return true;
|
13
picasso250 2015-07-17 11:45:33 +08:00
这里是PHP的比较表
http://php.net/manual/en/types.comparisons.php 在==的比较那里,可以看到 "php"==0的结果是true 当然,lz想要知道的是更深层的机制: http://php.net/manual/en/language.operators.comparison.php ==号的比较规则是比较 类型转换 后的值,如相同,则返回true 然后按照后面的表比较,很显然,左边的是 string, resource or number ,而右边的也是string, resource or number,此种情况下,都转换成数字再进行比较 剩下的就是11楼讲述的啦。 |