先说说一个常见的坑:不少人以为空数组 [] 能像 null 一样,配合 ?? 运算符来触发“缺失”判断——比如写 $arr ?? 'default',指望它返回默认值。但事实上 isset([]) 永远为 true,[] ?? 'default' 永远返回 []。空数组不是“未定义”,它本身就是一个已定义、非 null 的值。所以如果把它当作“条件未满足”的标志,结果永远是恒为真,逻辑会直接翻车。

在 PHP 7.1 里处理多条件判断,正确的思路不是“靠空数组来触发判断”,而是利用 ?? 安全取值,再配合显式的类型或状态校验——这样既能避免重复写 isset(),又能规避 Notice,语义也更加清晰。
为什么不能直接用空数组 + ?? 做多条件判断?
空数组 [] 本身就是已定义、非 null 的变量,isset([]) 返回 true,[] ?? 'default' 永远返回 []。它不表示“缺失”或“无效”,所以不能当作“条件未满足”的标志来用。如果误以为 $arr = []; if ($arr ?? false) { ... } 能判断“是否有数据”,实际会恒为真——这是 PHP 开发中很容易踩的误区。
真正实用的组合:?? 配合显式空/有效值检查
当你要同时确认多个字段(如 $_POST['name']、$_POST['email']、$_POST['age'])存在且非空时,推荐这样做:
- 先用
??安全取值,避免未定义键报 Notice:$name = $_POST['name'] ?? null;
$email = $_POST['email'] ?? null;
$age = $_POST['age'] ?? null; - 再统一用
!empty()或更精准的判断(如is_string($name) && trim($name) !== '')验证业务有效性; - 多条件合并判断可写成:
if ($name !== null && $email !== null && is_numeric($age) && $age > 0) { ... }
简化写法:链式 ?? + 一次判空(适合同类型字段)
若所有字段都应为非空字符串,可借助 ?? 提供默认值后批量判断:
$data = [
'name' => $_POST['name'] ?? '',
'email' => $_POST['email'] ?? '',
'city' => $_POST['city'] ?? ''
];- 然后:
if (!empty($data['name']) && !empty($data['email']) && !empty($data['city'])) { ... } - 优势:只访问
$_POST一次,无 Notice,逻辑集中,易扩展字段。
进阶技巧:函数封装 + 类型约束(PHP 7.1+)
把判断逻辑封装起来,配合可为空数组类型提示,提升可维护性:
- 定义函数接受
?array参数:function validateUserInput(?array $input): bool {
if ($input === null) return false;
return !empty($input['name']) && filter_var($input['email'], FILTER_VALIDATE_EMAIL);
} - 调用:
$isValid = validateUserInput($_POST); - 注意:这里
$_POST是数组,不会为null,但如果是从 API 解析的 JSON 数据,就可能为null,?array类型能准确表达这种可能性。
