if('xulei' == 0){
echo 1;
}else{
echo 2;
}
据说这是一道小米的php面试题,看到题目想当然的以为输出的是:2,在代码中验证了一下输出的是:1。惊出一身冷汗,赶紧翻一翻php官网手册。
以下摘抄一段php手册中的用户贡献的笔记:
The way PHP handles comparisons when multiple types are concerned is quite confusing.
PHP处理不同类型值的比较的方式是令人困惑的。
For example:
举个例子:
"php" == 0
这是真的,因为在比较时字符串将转化为一个整数。任何字符串(不是数字),转化成一个整数时将是0。
Note that php comparison is not transitive:
"php" == 0 => true
0 == null => true
null == "php" => false
坑在哪里?
php是一门弱类型语言,强类型和弱类型主要是站在变量类型处理的角度进行分类的。强类型是指不允许隐式变量类型转换,弱类型则允许隐式类型转换。所以,关键在于变量数据类型的转换。
什么叫隐式类型转换?
隐式是指源码中没有明显的类型转换代码,也就是说,一个变量,你可以直接给他赋值字符串,也可以直接给他赋值数值,你还可以直接让字符串类型的变量和数值类型的变量相加,虽然得出的最终结果未必是你想象的那样,但一定不会报错。
也就是说在上例的比较运算中,发生了变量类型的转换,但字符串与数字作比较的时候,字符串会被转换为数字,而不是数字的字符串转化成整数时会被转化成0。
再来补充一些
$a='2';//字符型2
$b=2;//数值型2
$a==$b,是对的,都是2
$a===$b,是不对的,因为$a是字符型$b是数值型,值虽一样,但类型不一样。
领取专属 10元无门槛券
私享最新 技术干货