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

PHP 中一个 False 引发的问题,差点让公司损失一百万的更多相关文章

  1. 一个致命的 Redis 命令,导致公司损失 400 万!!

    最近安全事故濒发啊,前几天发生了<顺丰高级运维工程师的删库事件>,今天又看到了 PHP 工程师在线执行了 Redis 危险命令导致某公司损失 400 万.. 什么样的 Redis 命令会有 ...

  2. linux 内核中一个全局变量引发的性能问题

    为了调试一个功能,在一个内核模块中,增加了一个全局变量,用来统计自有skb池的申请情况. 因为是临时增加,所以没有考虑性能,一开始只是一个fail的统计,数量不多,也不太考虑是否有计数丢失的情况,毕竟 ...

  3. Python 中一个逗号引发的悲剧

    遇到一个 Python 字符串的坑,记录一下.看看下面这些代码 >>> a = [ ... 'foo' ... 'bar', ... 'tree' ... ] >>> ...

  4. 一个致命的 Redis 命令,导致公司损失 400 万

    什么样的 Redis 命令会有如此威力,造成如此大的损失? 具体消息如下: 看完这个消息后,我心又一惊,为什么这么低级的问题还在犯?为什么线上的危险命令没有被禁用?这事件报道出来真是觉得很低级... ...

  5. 一个字母引发的血案 java.io.File中mkdir()和mkdirs()

    一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...

  6. Spring之LoadTimeWeaver——一个需求引发的思考---转

    原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver——一个需求引 ...

  7. 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了。

    前言 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了. 判断相等 字符串判断相等 String str1 = null; String str2 = "jav ...

  8. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  9. Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

随机推荐

  1. 51Nod 1413 权势二进制 (思维)

    题意 : 一个十进制整数被叫做权势二进制, 当他的十进制表示的时候只由0或1组成.例如0, 1, 101, 110011都是权势二进制而2, 12, 900不是.当给定一个n (1<=n< ...

  2. Spring Cloud架构教程 (三)服务网关(基础)

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

  3. 好题Islands

    Orz yjc 吊打候选队 不好的思路是枚举森林的m块,这样DP显然会涉及n当做某一维,最多只能卷积优化一下 生成函数什么的n太大不用想 考虑m,k比较小,能不能把n变成一个系数,而不是维度 所以就是 ...

  4. css命名和书写规范

    前言 在项目开发中对于css名字的命名和书写老是感觉很混乱,这对于代码的可读性以及维护提出了挑战,所以在闲暇之余看了一些这方面的内容,现总结如下... 1.命名规则说明 所有的命名最好都小写 属性的值 ...

  5. java生成二维码学习笔记

    纠错等级: QRErrorCorrectLevel.L 7%的字码可被修正 QRErrorCorrectLevel.M 15%的字码可被修正 QRErrorCorrectLevel.Q 25%的字码可 ...

  6. hadoop stop-dfs.sh 无法停止 namenode datanode

    原因: HADOOP_PID_DIR 默认为 /tmp 目录,如果长期不访问/tmp/目录下的文件,文件会被自动清理,因此 stop-dfs.sh 无法根据 pid 停止 namenode, data ...

  7. tensorflow 中图像的读取

    1. 使用gfile读入文件内容.输入的是String,输出3-D tensor.可惜的是输入不能是tensor def decode_jpg(path): r""" 读 ...

  8. sklearn—支持向量机

    SVC介绍: 拟合出来的模型为一个超平面 解决与样本维数无关,适合做文本分类 解决小样本.非线性.高维 是用于分类.回归.孤立点检测的监督学习方法的集合. 优点: 有效的高维空间 维数大于样本数的时候 ...

  9. Java中class的声明

    在Java中下面Class的声明哪些是错误的?(A,B,C)   A:public abstract final class Test { abstract void method();} B:pub ...

  10. Redis存储对象序列化和反序列化

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInpu ...