一些容易出错的细节

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.

posted @ 2015-10-23 11:11  freephp  阅读(305)  评论(0编辑  收藏  举报