PHP的陷阱

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";
}

这就药丸。

posted @ 2016-11-04 18:07  一杯半盏  阅读(84)  评论(0编辑  收藏  举报