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

  • 相关阅读:
    Nginx编译参数详细注释(解释)(转载)
    linux 下开机同步时间
    115转存代码
    清除linux下history命令
    【python学习1】编写猜数字的小游戏
    对深层嵌套的代码进行重构
    JS对JSON的操作总结
    调程序的小女孩(感谢安徒生)(转)
    区块链资料
    aws创建实例 通过密钥登录后 更改root账号密码 创建普通账户 开放ssh密码登录 关闭root账号登录
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/11406420.html
Copyright © 2011-2022 走看看