一、前方有坑
php属于弱类型语言,不会强迫工程师在使用变量之前先声明变量类型,开发时爽了,但是也带来不少的坑。下面就举一个坑的例子:
例1:
$str = ‘haodaquan';
echo ($str == 0) ? 1 : 0;
运行结果是:
1
这个坑,在好多公司的笔试题里出现,当然没有这么直接的考,会隐晦一些,比如下面的题目:例2
$arr = [1,'aa'=>[2,2]];
foreach ($arr as $key => $value) {
if ($key=='aa') {
var_dump($value);
}
}
请问打印的结果是什么?
原理是一样的:比较0==‘aa’,都是考察字符串和数字相比较,即数据类型转换的问题。
结果如下:
int(1)
array(2) {
[0]=>int(2)
[1]=>int(2)
}
二、防坑攻略
在做比较运算时,应考虑比较双方的类型,弱类型语言虽然对变量数据没有严格要求,编程时也应该对变量数据的类型有所判定。
三、为何有坑
“==”表示先将比较双方的类型转化成同一类型,然后在对值进行比较。在例1中,比较”haodaquan“==0,首先将字符串”haodaquan“默认转换为integer类型(为啥是integer类型呢?后面揭晓),我们知道 (int)”haodaquan“=0,而0==0是成立的,所以结果显示为1。
四、防坑扩展
彻底弄清楚这些类型转换(就是刚才例1中为啥转换为integer类型)才是防坑的关键。在php中数据类型之间的转换分为两种:强制类型转换和自动类型转换(有的也叫默认类型转换)。
1、强制类型转换
php数据类型转换的方法有三种,这里我们以字符串转浮点型为例,其他类型请自行查手册
$s = "1a22aa.121";
#第一种强制类型转换:
var_dump((float)$s);
#第二种强制类型转换:
var_dump(floatval($s));
#第三种强制类型转换:
settype($s, 'float');
var_dump($s);
我经常使用第一种,简单。
另外,字符串强制转换浮点型或者整型,会从左边逐一检查字符串,遇到不合格的字符出现就停止。
2、自动类型转换
1、算数运算符(加、减、乘、除、取余数等),自动按照数字型变量进行处理,也就是说,这些都是合法的。
$a = '123b';
$b = '12b';
var_dump($a+$b,$a-$b,$a*$b,$a/$b,$a%$b);
2、“==” 做比较,如果比较一方是布尔型,则另一方转为布尔型再比较值。
如果比较一方是浮点型,则另一个先转为浮点型进行比较。(另一方非布尔型)
如果比较一方是数字型,则另一个先转为数字型(int)进行比较。(另一方非布尔型和浮点型)
以上估计够用了,想要更加深入,请参考php手册里的《PHP手册类型表》一节。
五、防坑互动:
1、下面代码:
$s = "1.23a22aa.121";
var_dump((float)$s);
结果显示是:??
2、补上期的互动题目,也是笔试题里经常设置的坑题:
$a = count ("abc");
$b = count ("");
$c = count (null);
$d = count (false);
var_dump($a,$b,$c,$d);
结果显示是:??
3、补充一个烧脑的,估计答对的少:
$a = '123b';
$b = '12a';
var_dump($a<$b);
结果显示是:???
请看官们讨论结果吧 !^_^