zoukankan      html  css  js  c++  java
  • PHP 中一个 False 引发的问题,差点让公司损失一百万

    PHP 中一个 False 引发的问题,差点让公司损失一百万

    一、场景描述

    上周我一个在金融公司的同学,他在线上写一个 Bug,差点造成公司损失百万。幸好他及时发现了这个问题并修复了。这是一个由 PHP 中的 empty 引发的问题。他使用 empty 函数判断值为 False 的参数。按照他的正常逻辑理解,下面这段代码会输出 Yes。但是,结果却是相反的。

    $arr['is_default'] = false;
    
    if (!empty($arr['is_default'])) {
        echo "Yes";
    }
    

    虽然,这个 Bug 引发的问题,得到了及时解决。但是,如果发布到生产环境了,可能会造成比较大的损失。因此,这也体现了我们在编程当中,要注意很多的细节,以免发布到生产环境之后造成不可挽回的损失。

    二、列举 PHP 中 empty 函数会返回 False 的情况

    1、' ' 空字符串

    $arr['is_default'] = "";
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    

    2、0 整数零

    $arr['is_default'] = 0;
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    
    // 输出
    Yes
    

    3、0.0 浮点数零

    
    $arr['is_default'] = 0.0;
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    
    // 输出
    Yes
    

    4、"0" 字符串零

    arr['is_default'] = "0";
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    
    // 输出
    Yes
    

    5、null

    $arr['is_default'] = null;
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    
    // 输出
    Yes
    

    6、false

    $arr['is_default'] = false;
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    
    // 输出
    Yes
    

    7、array() 空数组

    $arr['is_default'] = [];
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    
    // 输出
    Yes
    

    8、$var 一个声明并未赋值的变量

    $var;
    $arr['is_default'] = $var;
    
    if (empty($arr['is_default'])) {
        echo "Yes";
    } else {
    	echo  "No";
    }
    
    // 输出
    Yes
    

    三、思考

    PHP 作为一门弱类型语言,可能我们在编写代码时,会比较随性。但是随性带来的风险可能会很高,所以我们在编程的时候,还是应该要注意到很多语言的细节。

  • 相关阅读:
    openlayers wfs获取要素
    ArcEngine 直连连接SDE
    arcgis中的 style和serverstyle
    C#开源大全
    C#+ArcEngine 序列化和反序列化AE对象
    C# lazy加载
    Testing 理论测试(三)
    软件开发模型种类(7)
    Testing理论测试题(二)
    Testing 理论测试题(一)
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/11406420.html
Copyright © 2011-2022 走看看