一些容易出错的细节
php是弱类型语言,和一些其他编程语言在处理一些数据类型的时候有所不同。
我最近做的一个限号的需求,我就犯了一个错误。
如下:
<?php $a = '0'; $a = (bool)$a; if ($a) { echo "string 0 not equals false\n"; } else { echo "string 0 equal false\n"; } $b = -1; if ($b) { echo "-1 not equal false\n"; } else { echo "-1 equals false\n"; }
运行结果如图:
我当时犯的一个错误就是把-1认为转成bool类型会是false,其实php自有一套判断方式。
Note:If the value parameter is omitted, or is 0, -0, null, , false, undefined, or NaN, the object is set to false. Otherwise it is set to true (even with the string false)!
所以对于$b的判断只能用数值判断
if ($b <0) { echo "-1 equal false";}
在强类型语言,如java中,也只能用这样数值的判断方式,它也不允许直接从int类型强制转换类型到boolean。与php相比,直接规避了这种麻烦。
那么有人又不服了,为什么不说说JavaScript?
<script type="text/javascript">
var a='0';
if(a){
alert(1);
}else{
alert(0);
}
</script> 值为true。
js也是若类型,会把a当做字符串,在if判断中就当做了true.
写到这里让我想起去某欧面试的一道比较非主流的面试题:
-8%(-3) = ?
答案是-2。这是取余,商2,-8 - (-6) = -2.
php就是这么任性。
还有个容易忘记的事儿就是在循环中改变数值的保存。其实常见的有两种方式,以前在聚美的时候见过有强烈c语言风格的写法。往往都是新设一个数组,然后去装要改变的数据。还有一种 就是用引用。如果关联性比较大且后面操作组合比较麻烦,我会选第二种。引用也会节省内存空间消耗。试想一下一个大的报表的原始数据数组,被你用新的数组去装,而且这个你要的数据只是临时变量并不复用,这成本也忒大了。
弱类型让很多判断变得需要更加严谨,因编译器不帮你事先判断,你只能用逻辑去堵可能出现的bug。没有一样东西是完美的,看似完美的背后都有致命伤。
God is in details.