关于 PHP 的一个问题, 有人能解释一下吗?

2015-07-16 12:12:53 +08:00
 samael

项目需要, 刚学用PHP, 发现了个奇怪的问题, 有人能解释一下为什么吗?

$str = "aaaa";
if($str == 0) {
    echo ('What the fuck'); // 为什么在这里?
} else {
    echo ('I wanna it');
}
2486 次点击
所在节点    PHP
13 条回复
b821025551b
2015-07-16 12:16:37 +08:00
字符“aaaa”对应类型为false;
0对应类型为false;
false===false
wy315700
2015-07-16 12:18:33 +08:00
==不检查类型
===会检查类型
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');
}
samael
2015-07-16 12:37:54 +08:00
lua javascript python 这样的弱类型语言在对比 str == 0 全返回的是false
我是想知道php为什么会这样处理
arzusyume
2015-07-16 12:42:53 +08:00
js里"aaaa"转Number是NaN,
php里intval的结果就是0

用 == 不是好习惯, 应该明确类型后使用 ===
xdazz
2015-07-16 13:14:36 +08:00
samael
2015-07-16 13:18:53 +08:00
@xdazz 多谢, 这才是我想要的
iyaozhen
2015-07-16 13:43:12 +08:00
比较的时候会有类型转换,字符串转化成int时会看字符串的第一个字符,如果第一个不是数字的话就变成0了。

你改成"1aaa" 就不相等了
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
123123
2015-07-16 15:58:22 +08:00
1L 这理论从哪个语言来的
realpg
2015-07-16 20:17:53 +08:00
PHP的==跟判断机制变量类型有关

当一个字符串去跟数字==的时候,首先会把字符串转成数字,等效隐式对字符串使用intval()
然后你去查intval的处理特性,是从左往右找可转换为int的串,遇到不可转换的非法字符后忽略后面的所有字符。

而且intval保证返回的是一个int类型的数字,所以异常的输入(比如从头开始就第一个字符就不能合法转换的)返回的就是0
doushiyinweini
2015-07-16 21:27:59 +08:00
var_dump( 2 == "2b" ); // 有人说你2,其实就是说你2b的意思 所以 return true;
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楼讲述的啦。

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

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

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

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

© 2021 V2EX