1)foreach一个字符串或NULL时,出现警告,自动跳过foreach代码段,应该为数组或对象。
if( ! is_array($v) ){ $v = [$v]; } 或 if( ! is_array($v) && ! is_object($v)){ $v = [$v]; }
2)count一个NULL或字符串或对象时,出现警告,并且返回0,应该为数组。
$n = is_countable($v) ? count($v) : 0;
3)访问了对象不存在的属性时,出现警告,并且返回null。
<?php
$obj = new stdClass();
$obj->val = 'This is a value.';
$val = !$obj || !property_exists($obj, 'val') || $obj->val; //错误的写法
var_dump($val); //true
if($obj && property_exists($obj, 'val')){ //正确的写法
$val = $obj->val;
} else{
$val = null;
}
var_dump($val); //'This is a value.'
$val = $obj && property_exists($obj, 'val') ? $obj->val : null; //正确的写法
4)访问了数组不存在的索引下标时,出现警告,并且返回null。
$v = isset($arr[$i]) ? $arr[$i] : null;
$v = $arr[$i] ?? null;
5)访问对象属性时,对象为NULL,出现警告,并且返回null。
$obj = new stdClass();
$val = $obj && property_exists($obj, 'val') ? $obj->val : null; //正确的写法
6)where_in数组过大时,如$this->db->where_in('location_id',$location_ids);
会出现警告:preg_match(): Compilation failed: regular expression is too large at offset 37532
$location_ids_chunk = array_chunk($location_ids,25);
$this->db->group_start();
foreach($location_ids_chunk as $location_ids_arr)
{
$this->db->or_where_in('location_id',$location_ids_arr);
}
$this->db->group_end();
7)