php一些坑

作者: 零一间 | 来源:发表于2017-09-24 05:14 被阅读33次

    1 foreach中的引用(&)

    $dataArr = range(1, 5);
    foreach ($dataArr as $k => &$value) {
        var_dump($value );
    }
    var_dump('-------------------------');
    foreach ($dataArr as $k => $value) {
        var_dump($value );
    }
    

    打印结果,发现第二次的最后两项是一样的:

    int(1)
    int(2)
    int(3)
    int(4)
    int(5)
    string(25) "-------------------------"
    int(1)
    int(2)
    int(3)
    int(4)
    int(4)
    

    解决方案: unset()

    $dataArr = range(1, 5);
    foreach ($dataArr as $k => &$value) {
        var_dump($value );
    }
    unset($value);//unset 掉最后一个引用
    var_dump('-------------------------');
    foreach ($dataArr as $k => $value) {
        var_dump($value );
    }
    

    再次打印:

    int(1)
    int(1)
    int(2)
    int(3)
    int(4)
    int(5)
    string(25) "-------------------------"
    int(1)
    int(2)
    int(3)
    int(4)
    int(5)
    

    array_merge Null ,一般的框架会处理的,原生方式可能会出现

    array_merge — 合并一个或多个数组

    $arr1 = [
        'a',
        'b',
        'c',
    ];
    $arr2 = [
        'c',
        'd',
        'f',
    ];
    $arr3 = null;//可能从某个对象中获取的值,如果不加处理会返回类似数据
    
    error_reporting(0);
    var_dump(array_merge($arr1,$arr2,$arr3));
    

    打印结果:

    NULL
    

    解决方案:

    方式1:开发的时候错误等级使用:ERR_ALL

    如下:

    error_reporting(E_ALL);
    

    此时运行程序,好歹有了提示:

    PHP Warning:  array_merge(): Argument #3 is not an array in F:\Visual-NMP-x64\www\tutorial\demo\01\test.php on line 17
    
    Warning: array_merge(): Argument #3 is not an array in F:\Visual-NMP-x64\www\tutorial\demo\01\test.php on line 17
    NULL
    

    方式2:判断是否为NULL,或者类型转换一下

    代码:

    error_reporting(E_ALL);
    var_dump(array_merge($arr1, $arr2, (array)$arr3));
    

    此时恢复正常:

    array(6) {
      [0]=>
      string(1) "a"
      [1]=>
      string(1) "b"
      [2]=>
      string(1) "c"
      [3]=>
      string(1) "c"
      [4]=>
      string(1) "d"
      [5]=>
      string(1) "f"
    }
    

    提示:数字键名将会被重新编号!

    字符的数字和数字比较

    例如:

    var_dump('200abc' == 200);
    

    打印结果:

    bool(true)
    

    采用类型转换一下:

    var_dump('200abc' == (string)200);
    

    打印结果:

    bool(false)
    

    count函数传入字符

    如果集合数据不处理,可能会出现一下情况:

    var_dump(count(false));
    var_dump(count(null));
    

    打印结果:

    int(1)
    int(0)
    

    不用说了,类型提前处理.

    filesize缓存

    例如:

    <?php
    
    $fileName = 'city.txt';
    
    file_put_contents($fileName, json_encode(range(1, 5)));
    var_dump(filesize($fileName));
    
    file_put_contents($fileName, json_encode(range(1, 100000)));
    var_dump(filesize($fileName));
    

    打印结果,文件大小一样:

    int(11)
    int(11)
    

    解决方式 clearstatcache():

    <?php
    
    $fileName = 'city.txt';
    
    file_put_contents($fileName, json_encode(range(1, 5)));
    var_dump(filesize($fileName));
    
    clearstatcache();//清除缓存
    file_put_contents($fileName, json_encode(range(1, 100000)));
    var_dump(filesize($fileName));
    

    打印结果:

    int(11)
    int(588896)
    

    暂时想了这么多,先写到这里~~

    相关文章

      网友评论

        本文标题:php一些坑

        本文链接:https://www.haomeiwen.com/subject/tcohextx.html