PHP 7+ 应优先使用 ?? 运算符处理未定义或 null 值,它不误判 0、false、'' 等假值;嵌套访问需注意中间层塌陷,PHP 7.4+ 支持多层 ??,旧版需逐层防御或工具函数。

直接用 ?? 运算符最安全
PHP 7+ 原生支持空合并运算符 ??,它只在键**不存在**或值为 null 时才触发默认值,不会误判 0、false、'' 这类“假值”。
-
$name = $user['name'] ?? 'anonymous'—— 键未定义或值为null才回退 - 嵌套写法在 PHP 7.4+ 支持:
$city = $user['address']['city'] ?? 'unknown' - PHP 7.3 及更早必须拆开:
$city = ($user['address'] ?? [])['city'] ?? 'unknown' - 别用
@$user['name'] ?: 'anonymous':错误抑制不解决根本问题,且?:会把0当空处理
$_POST 和 $_GET 字段没传时不能靠 isset() 套娃
用户不提交字段是常态,$_POST['email'] 根本就不存在,直接访问会报 Notice: Undefined index。用 isset() 判断再取值,代码冗长还容易漏掉 null 或空白字符串的边界情况。
- 首选:
$email = $_POST['email'] ?? ''(键不存在或为null时给空字符串) - 要过滤空格:
$email = trim($_POST['email'] ?? '') ?: 'no-email' - 需类型安全或过滤注入:
$id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT) ?? 0 - 批量设默认值可用
array_merge(),但注意:如果$_POST里有null,它会覆盖默认值,此时应改用array_replace_recursive()或循环判断
函数参数默认值不是万能的,别指望它兜底 null 或空字符串
函数签名里写 function foo($msg = 'default'),只在调用时**完全省略该参数**才生效。一旦你传了 null、''、甚至一个未定义变量 $msg,默认值就失效了,还会先抛 Notice: Undefined variable。
- 正确做法:用可空类型声明 + 函数内校验,例如
function foo(?string $msg = null): void { $msg = $msg ?: 'default'; } -
?string明确告诉调用方“这个参数可以不传”,也防止意外传入数组或对象 - 如果需要排除纯空白字符串,加
trim():$msg = trim($msg) ?: 'default' - 避免在调用侧写
foo($msg ?: 'default')——默认逻辑分散,维护成本高
数组键缺失后想“补上”默认值,用 ??= 更简洁
PHP 7.3+ 引入了空合并赋值运算符 ??=,它只在左侧变量为 null 或未定义时才赋值,比 ||= 更精准,也不会覆盖 0、false 等合法值。
立即学习“PHP免费学习笔记(深入)”;
-
$config['host'] ??= 'localhost';—— 仅当$config['host']未设置或为null才写入 -
$user['level'] ??= 1;—— 不会把已存的0改成1 - 它不递归,
$user['profile']['avatar'] ??= 'default.jpg'会报错(因为$user['profile']是null,不能取['avatar']),得先确保上层存在 - 老版本 PHP 没
??=?等价写法是:if (!isset($arr[$key])) { $arr[$key] = $default; }
$data['user']['profile']['avatar'] ?? 'default' 看似合理,但只要 $data['user'] 或 $data['user']['profile'] 是 null,就会触发 Trying to access array offset on null,而不是静默回退。这种时候,?? 失效,必须逐层防御或换用工具函数。



















