zoukankan      html  css  js  c++  java
  • 一些容易出错的细节

    php是弱类型语言,和一些其他编程语言在处理一些数据类型的时候有所不同。

    我最近做的一个限号的需求,我就犯了一个错误。

    如下:

    <?php
    
    $a = '0';
    
    $a = (bool)$a;
    
    if ($a) {
        echo "string 0 not equals false
    ";
    } else {
        echo "string 0 equal false
    ";
    }
    
    $b = -1;
    
    if ($b) {
        echo "-1 not equal false
    ";
    } else {
        echo "-1 equals false
    ";
    }

    运行结果如图:

    我当时犯的一个错误就是把-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.

  • 相关阅读:
    Java语言
    包名规范
    带参数的方法
    成员变量和局部变量
    Java数据类型
    java反射机制
    JDK安装
    注释
    二维数组
    数组的经典排序
  • 原文地址:https://www.cnblogs.com/freephp/p/4903860.html
Copyright © 2011-2022 走看看