PHP 7.0 不支持 ?string 等可空类型,会直接报 Parse error;必须升级至 PHP 7.1+ 才可用,且 ?string 表示明确的 string|null 契约,要求调用方严格处理 null 分支。

PHP 7.0 不支持 ?string 这类可空类型写法,直接写会报语法错误;必须升级到 PHP 7.1+ 才能用 ?Type。
PHP 7.0 写 ?string 会直接 Parse Error
PHP 7.0 的词法解析器根本不认识 ? 前缀,遇到 function foo(): ?string 这种写法,会在编译阶段抛出 Parse error: syntax error, unexpected '?' 。这不是运行时警告,是根本过不了解析关。
- 哪怕只在注释里写了
?string,只要它出现在函数签名位置(比如返回类型声明处),就会触发错误 - PHP 7.0 支持的返回类型只有
string、int、array等基础类型,以及自定义类名,但不接受任何前缀修饰符 - 想“模拟”可空行为?只能退回到
mixed或干脆不写返回类型声明——但这会失去类型约束
PHP 7.1+ 的 ?string 不是“宽松版 string”,而是明确的 string|null 合约
一旦用了 ?string,调用方就必须按“可能为 null”来处理:不能直接解引用、不能跳过空值检查、静态分析工具(如 PHPStan)也会据此推导分支逻辑。
-
function getName(int $id): ?string→ 调用后必须先判断if ($name !== null),再用$name[0]或strlen($name) - 如果函数内部写了
return null;,但声明是: string(没加?),PHP 7.1+ 会立刻抛TypeError,和strict_types开没开无关 -
?string和string|null在 PHP 8.0+ 是等价的,但 PHP 7.1–7.4 只认?string写法;混用?string|null是非法的
从 PHP 7.0 升级到 7.1 时,void 和返回类型声明要同步检查
PHP 7.0 已支持 void,但很多人当时没用;升级后若给已有函数加了 : void,却忘了删掉旧的 return $value;,会立即报错 Fatal error: A void function must not return a value。
立即学习“PHP免费学习笔记(深入)”;
-
return;和隐式无返回(函数末尾自然结束)都合法;return null;也合法(因为null不算“值”);但return "done";就不行 - 如果原函数本该有返回值,别为了“快速升级”强行改成
: void——契约变了,所有调用点都要改 - PHP 7.1 的返回类型检查是强制的,哪怕没开
declare(strict_types=1),只要声明了: int却return "123",照样抛TypeError
最易被忽略的是:可空类型不是“容错开关”,而是契约升级。写 ?array 意味着你主动承担了空值分支的处理责任,而不是让调用方去猜“这个数组到底会不会是 null”。



















