未定义变量与空数组状态不同:未定义时isset()和empty()均返回false,而空数组isset()为true;判断数组需先is_array()再count()===0;访问键值应使用??或array_key_exists()而非empty()。

刚学PHP时,很多人会把“没写这行代码”和“写了$arr = []”当成一回事,结果在if($arr)、empty($arr)甚至isset($arr)里得到意外结果。关键不是值“看起来空”,而是变量本身的状态:它到底存不存在?有没有被声明?类型对不对?
未定义变量 vs 显式定义的空数组
这是最基础也最容易混淆的起点:
-
未定义变量:比如全程没出现过
$data这个词,直接写echo $data['id'];——立刻报Notice: Undefined variable;用isset($data)返回false,empty($data)也返回true(且不报错) -
已定义的空数组:写了
$data = [];或$data = array();,此时isset($data)为true,is_array($data)为true,count($data) === 0也为true
判断“是不是数组”不能只靠 empty()
empty($arr)对null、false、0、''、[]全都返回true,它根本不关心类型。所以如果$arr可能是字符串"0"、整数0,甚至null,用empty($arr)就无法区分它到底是不是数组。
- 安全做法:先确认是数组,再看是否为空 →
is_array($arr) && count($arr) === 0 - 更稳妥(防未定义):→
isset($arr) && is_array($arr) && count($arr) === 0 - 别用
!$arr或empty($arr)代替,它们会把"0"或0也当“空数组”处理
访问数组元素前,别直接用 $arr['key']
哪怕$arr是合法空数组,$arr['name']仍然可能触发Undefined index警告——因为键'name'根本不存在。
立即学习“PHP免费学习笔记(深入)”;
- 想读值又不想报错 → 用空合并运算符:
$name = $arr['name'] ?? 'default'; - 想确认键是否存在(不管值是什么)→
array_key_exists('name', $arr) - 想确认键存在且值非
null→isset($arr['name']) - 别用
empty($arr['name'])来判断“有没有这个字段”,因为0、false、''都会被误判为“不存在”
null 值在数组里是个特例
数组中可以有null作为有效值:$arr = ['user' => null];。这时isset($arr['user'])是false,但array_key_exists('user', $arr)是true,说明键存在,只是值被设成了null。
- 检测某个键是否含
null值 →$arr['user'] === null(注意用===) - 检查数组里是否有任意
null元素 →in_array(null, $arr, true)(第三个参数true开启严格比较) - 别用
is_null($arr['user'])去判断未定义键,它会对不存在的键报Notice



















