PHP的陷阱

写代码的时候有个疑惑,那就是数组下标不存在的时候就会挂掉Undefined Index XXXX,这是对的,但是有时候他就不报错,这又是矛盾的。

请看下面的例子:

$json_raw = "{\"data\":null}";
$data = json_decode($json_raw,true); $image_hash = $data['data']['image_hash'];//<1>
echo $image_hash . PHP_EOL; $arr1 = ['data' => null];
echo $arr1['data']['index']; //<2> $arr2 = [];
echo $arr2['data']['index']; //<3>

假定json_raw是HTTP某上传图片的接口返回的字符串。
那么可以明确告诉你,只有<3>会出现PHP Error致命错误。

那又如何?
再看下面的例子

$data = self::extractData($retData);
if($data['retcode'] == 0){
echo "Pass"; //<4>
}

某HTTP请求返回

{
"code": 200,
"data": {
"retcode":0,
"msg":"success",
"success":true
}
"message":"success"
}

程序提取了数据,$retData里面的。那么确实是成功了。

但是要是返回

{
"code": 200,
"data": null
"message":"system error"
}

<4> 依旧会输出Pass.

是不是很奇怪?所以最好这么写

$data = self::extractData($retData);
if($data != null && $data['retcode'] == 0){
echo "Pass"; //<4>
}

原因:下标不存在报警的前提是:
1. 他是数组
2. 他的某下标不存在

null不是数组,条件1 不满足null['index'],他会返回0或者null之类的,而php会把 null 和 0 认为是一样的。导致意想不到的错误的发生。

if(null == 0){
echo "yes";
}

这就药丸。

PHP的陷阱的更多相关文章

  1. 你可能不知道的陷阱, IEnumerable接口

    1.  IEnumerable 与  IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...

  2. java笔记--笔试中极容易出错的表达式的陷阱

    我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用 ...

  3. 【Swift】iOS UICollectionView 计算 Cell 大小的陷阱

    前言 API 不熟悉导致的问题,想当然的去理解果然会出问题,这里记录一下 UICollectionView 使用问题. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cn ...

  4. JavaScript中的this陷阱的最全收集

    JavaScript来自一门健全的语言,所以你可能觉得JavaScript中的this和其他面向对象的语言如java的this一样,是指存储在实例属性中的值.事实并非如此,在JavaScript中,最 ...

  5. 高性能MySQL(四):schema陷阱

    一.schema陷阱 二.缓存表和汇总表 三.范式和反范式

  6. C#_闭包陷阱

    如果匿名方法(Lambda表达式)引用了某个局部变量,编译器就会自动将该引用提升到该闭包对象中. 即将for循环中的变量i修改成了引用闭包对象的公共变量i.这样一来,即使代码执行后离开了原局部变量i的 ...

  7. 安装 Linux 时碰到的硬盘分区的陷阱及应对

    硬盘分区的陷阱及应对 之所以想到写这篇,是因为本人在折腾 Linux 系统的过程中,有多次掉入硬盘分区的陷阱的经历.最近几天,再一次掉入坑中,折腾了两天才从坑中爬出来.经过多方查询资料,终于弄明白了硬 ...

  8. NULL的陷阱:Merge

    NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是fals ...

  9. 洛谷P1156 垃圾陷阱[背包DP]

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...

  10. JavaScript中的this陷阱的最全收集 没有之一

    当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概 念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解 ...

随机推荐

  1. FastDfs之TrackerServer的详细配置介绍

    # is this config file disabled # false for enabled # true for disabled disabled=false #当前配置是否不可用fals ...

  2. MySql一个生产死锁案例分析

    接到上级一个生产环境MySQL死锁日志信息文件,需要找出原因并解决问题.我将死锁日志部分贴出如下: 在mysql中使用命令:SHOW ENGINE INNODB STATUS;总能获取到最近一些问题信 ...

  3. Kafka 学习笔记之 Consumer API

    Kafka提供了两种Consumer API High Level Consumer API Low Level Consumer API(Kafka诡异的称之为Simple Consumer API ...

  4. 快学Scala 第一课 (变量,类型,操作符)

    Scala 用val定义常量,用var定义变量. 常量重新赋值就会报错. 变量没有问题. 注意:我们不需要给出值或者变量的类型,scala初始化表达式会自己推断出来.当然我们也可以指定类型. 多个值和 ...

  5. 再探vue

    1. vue项目搭建 搭建vue环境需要安装node软件,node是由c++编写而成,主要运行js文件或者js代码的,安装node会自动安装一个管理器叫npm,建议换源下载,国外的网站较慢(比如cnp ...

  6. C语言I博客作业03

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/8717 我在这个课程的目 ...

  7. mysql引号与esc键下方键

    navicat导出数据表发现建表语句如下: create table `product_category` ( `category_id` int not null auto_increment, ` ...

  8. TCP三次握手、四次握手

    前言 TCP用于应用程序之间的通信.当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求.这个请求必须被送到一个确切的地址.在双方“握手”之后,TCP将在两个应用程序之间建立一个全双工 ...

  9. Cocos2d-x入门之旅[2]精灵

    精灵就是cocos是屏幕上移动的对象,能被我们控制,比如我们HelloWorld场景的这个图片就是精灵(Sprite) 怎么才算精灵?你能控制它的,就是一个精灵,否则就只是一个节点(Node) 准确的 ...

  10. RAID5 配置,3块磁盘,2快备份

    1. 在虚拟机中再添加5块硬盘: 2. 用fdisk -l 可以查看当前虚拟机磁盘情况. 3. 使用mdadm命令创建RAID5,名称为”/dev/md0″. -C代表创建操作,-v显示创建过程,-n ...