PHP 7.0 起应优先用 ?? 替代 ?: 处理未定义变量,因 ?: 在变量未声明时会触发 Undefined variable Notice,而 ?? 专为存在性检查设计;安全写法是先 ?? 取值再 ?: 判断真假,数组访问和函数参数同理。

直接用 ?? 替换 ?: 处理未定义变量,是 PHP 7.0 中避免 Notice 警告最简单有效的方式。关键不是“怎么让 ?: 不报错”,而是认清两者的职责边界:?: 用于真假值判断,要求变量已声明;?? 专为存在性检查设计,天然兼容未定义或 null。
?: 触发警告的根本原因
$name ?: 'guest' 在 $name 完全未定义时,PHP 会先尝试读取该变量——这一步就触发 Notice: Undefined variable。它不是因为“值为假”才报错,而是因为“根本不可访问”。
- ❌ 错误做法:
$value = $input ?: 'default';(当$input未声明时崩溃) - ✅ 正确做法:
$value = $input ?? 'default';(安全,不报错)
安全组合写法:先 ?? 再 ?:
多数真实场景中,你既要防未定义,又要过滤 falsy 值(比如 '0'、0、'')。这时应分两步:
// 先用 ?? 取值(防未定义),再用 ?: 判断真假(防空/零) $username = ($_GET['user'] ?? '') ?: 'guest'; // 或更严谨(排除 '0' 也被当假的情况): $input = $_GET['user'] ?? null; $username = ($input !== '' && $input !== '0') ? $input : 'guest';
数组键访问必须用 ?? 或 isset()
别写 $_POST['email'] ?: 'no-email' —— 若键不存在,直接报 Notice。改用:
立即学习“PHP免费学习笔记(深入)”;
$email = $_POST['email'] ?? 'no-email'; // 推荐,简洁安全 // 或 $email = isset($_POST['email']) ? $_POST['email'] : 'no-email';
函数参数默认值不能依赖 ?:
以下写法危险:
function greet($name) {
return 'Hello, ' . ($name ?: 'Guest'); // 若调用 greet() 且 $name 未传,会报 Notice
}应改为:
function greet($name = null) {
return 'Hello, ' . ($name ?? 'Guest');
}或者更明确地用默认参数语法(PHP 7.1+ 支持 ?string 类型声明,但默认值本身仍推荐 ?? 配合)。
不复杂但容易忽略。



















