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 作为一门弱类型语言,可能我们在编写代码时,会比较随性。但是随性带来的风险可能会很高,所以我们在编程的时候,还是应该要注意到很多语言的细节。
PHP 中一个 False 引发的问题,差点让公司损失一百万的更多相关文章
- 一个致命的 Redis 命令,导致公司损失 400 万!!
最近安全事故濒发啊,前几天发生了<顺丰高级运维工程师的删库事件>,今天又看到了 PHP 工程师在线执行了 Redis 危险命令导致某公司损失 400 万.. 什么样的 Redis 命令会有 ...
- linux 内核中一个全局变量引发的性能问题
为了调试一个功能,在一个内核模块中,增加了一个全局变量,用来统计自有skb池的申请情况. 因为是临时增加,所以没有考虑性能,一开始只是一个fail的统计,数量不多,也不太考虑是否有计数丢失的情况,毕竟 ...
- Python 中一个逗号引发的悲剧
遇到一个 Python 字符串的坑,记录一下.看看下面这些代码 >>> a = [ ... 'foo' ... 'bar', ... 'tree' ... ] >>> ...
- 一个致命的 Redis 命令,导致公司损失 400 万
什么样的 Redis 命令会有如此威力,造成如此大的损失? 具体消息如下: 看完这个消息后,我心又一惊,为什么这么低级的问题还在犯?为什么线上的危险命令没有被禁用?这事件报道出来真是觉得很低级... ...
- 一个字母引发的血案 java.io.File中mkdir()和mkdirs()
一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...
- Spring之LoadTimeWeaver——一个需求引发的思考---转
原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver——一个需求引 ...
- 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了。
前言 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了. 判断相等 字符串判断相等 String str1 = null; String str2 = "jav ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
随机推荐
- springmvc/springboot开发restful API
非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...
- Linux基础教程 linux awk内置变量使用介绍
awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是兄弟连Linux培训 给大家介绍的awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个 ...
- JavaScript的几种循环使用方式及性能解析
循环的类型 一:for var arr = [1, 2, 3, 4, 5, 6]; for (var i = 0, len = arr.length; i < len; i++) { conso ...
- 通过 PHP 生成 XML
如需使用 PHP 在服务器上生成 XML 响应,请使用下面的代码: <?php header("Content-type:text/xml"); echo "< ...
- 【每日一包0005】arr-flatten
github地址:https://github.com/ABCDdouyae... arr-flatten 将多维数组展开成一维数组 文档地址:https://www.npmjs.com/packag ...
- Vue 中 双向绑定数据
1.文本 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- __proto__ VS. prototype in JavaScript
__proto__ VS. prototype in JavaScript http://dmitrysoshnikov.com/ecmascript/javascript-the-core/#a-p ...
- fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...
- 2017-03-04 idea破解
https://blog.csdn.net/qq_27686779/article/details/78870816 防止原址被删除,备份下,亲测可用 http://idea.java.sx/ 简单快 ...
- ARM过程调用标准——APCS
APCS(ARM Procedure Call Standard) 1.ARM寄存器 ARM核支持9种工作模式——User/System/Hyp+/SVC/Abort/Undefined/Monito ...