PHP 8 的 throw 表达式支持在表达式中直接抛异常并参与求值,可用于三元运算、空合并、箭头函数及函数返回语句中,实现紧凑、早中断的校验逻辑。

PHP 8 的 throw 表达式能让校验逻辑从多行 if-else 缩成一行,核心是把它当作“有返回值的异常抛出”,直接嵌入表达式中参与求值。
三元表达式里快速非空校验
传统写法要先判断再赋值,容易分散注意力:
$name = $input !== null ? $input : throw new InvalidArgumentException('Name is required');
这行代码等价于:若 $input 不为 null,就用它;否则立刻抛异常。注意必须用严格比较(!== null),避免把 0、'' 等 falsy 值误判为缺失。
空合并运算符(??)配合异常
处理请求参数最常用,语义更直白:
立即学习“PHP免费学习笔记(深入)”;
$id = $_GET['id'] ?? throw new BadRequestException('Missing id');
只要 $_GET['id'] 未设置或为 null,就抛错;否则直接取值。比 isset() + throw + 赋值三步更紧凑,也比 ?? null 后再单独检查更早中断错误流程。
箭头函数中做输入守卫
适合封装简单验证逻辑,复用性强:
$requireString = fn($value) => is_string($value) ? $value : throw new TypeError('Expected string');
调用时:$requireString($_POST['title']) —— 类型不对就立刻报错,不用在每个使用点重复写 if (!is_string(...))。
函数返回前做终局校验
让函数体保持表达式风格,不打断返回流:
function findUser(int $id): User { return $id > 0 ? new User($id) : throw new InvalidArgumentException('ID must be positive');}
这里 throw 是合法的返回分支,整个函数仍可被类型系统推导为返回 User(因为 throw 分支不参与类型计算)。



















