zoukankan      html  css  js  c++  java
  • 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";
    }

    这就药丸。

  • 相关阅读:
    C# 中的委托和事件
    POJ题目分类
    A*算法
    Poj 1077 eight(BFS+全序列Hash解八数码问题)
    Poj 2304 Combination Lock(模拟顺、逆时钟开组合锁)
    Poj 2247 Humble Numbers(求只能被2,3,5, 7 整除的数)
    Poj 2328 Guessing Game(猜数字游戏)
    Poj 2403 Hay Points(Map)
    Poj 1338 Ugly Numbers(数学推导)
    Poj 1504 Adding Reversed Numbers(用字符串反转数字)
  • 原文地址:https://www.cnblogs.com/slankka/p/9158511.html
Copyright © 2011-2022 走看看