PHP 7.x 不支持 string|null 联合类型,必须用 ?string(7.1+)或移除类型声明+注释+运行时校验(7.0)。属性仅7.4+支持 ?string,此前需构造函数/Setter手动校验。

PHP 7.x 完全不支持 string|null 这类联合类型语法,直接运行会报 ParseError: syntax error —— 必须改写,不能只加 polyfill 或注释模拟。
PHP 7.x 中声明可空字符串的合法写法
PHP 7.1+ 支持 ?string 作为参数和返回值的可空类型,这是唯一原生兼容的替代方案:
-
?string只能用于函数参数、返回值(PHP 7.4+)和类属性(PHP 7.4+),不能用于变量或数组键等上下文 -
?string等价于string|null的语义,但底层是语法糖,PHP 7.x 引擎只识别这种写法 - PHP 7.0 不支持
?string,必须降级为无类型声明 + 文档注释 + 运行时校验
示例改造:
// PHP 8.0 写法(PHP 7.x 直接报错)
function getName(int $id): string|null { /* ... */ }
<p>// ✅ PHP 7.4+ 兼容写法(推荐)
function getName(int $id): ?string { /<em> ... </em>/ }</p><p>// ✅ PHP 7.1–7.3 兼容写法(仅限参数/返回值,不支持属性)
function getName($id): ?string { /<em> ... </em>/ }
</p>
PHP 7.0 或严格禁用类型声明时的兜底方案
当项目要求兼容 PHP 7.0,或启用了 declare(strict_types=0) 且无法修改全局配置时,类型声明必须完全移除,靠文档和逻辑防御:
- 删除所有类型声明(包括
?string),改用@param string|null和@return string|null注释 - 在函数入口手动检查:用
is_string($value) || $value === null替代类型系统保障 - 避免依赖 IDE 自动推导 —— PHP 7.0 的 stubs 和静态分析(如 PHPStan 0.12)对
@return string|null支持有限,需配合if ($result !== null) { ... }显式分支
示例:
// PHP 7.0 兼容写法
/**
* @param int $id
* @return string|null
*/
function getName($id) {
if (!is_int($id)) {
throw new InvalidArgumentException('id must be int');
}
return $id === 1 ? 'Alice' : null;
}
属性声明(public/protected/private)在 PHP 7.x 的限制与绕过
PHP 7.4 才首次支持属性类型声明,且 ?string 在属性中合法;PHP 7.3 及更早版本不支持任何属性类型 —— string|null 和 ?string 都非法:
- PHP 7.4+ 属性可写为
public ?string $name;(等价于string|null) - PHP 7.3–7.0:只能去掉类型,改用注释 + 构造函数/Setter 校验
- 不要试图用
/** @var string|null */ public $name;让 IDE 提示 —— 这对运行时零保护,且部分老版本 PHPStorm 解析不稳定
安全写法示例(PHP 7.2):
class User
{
/** @var string|null */
public $name;
<pre class="brush:php;toolbar:false;">public function __construct(?string $name = null)
{
// 手动校验,弥补类型系统缺失
if ($name !== null && !is_string($name)) {
throw new TypeError('name must be string or null');
}
$this->name = $name;
}}
真正麻烦的不是语法替换,而是联合类型带来的契约意识 —— PHP 7.x 下,string|null 的语义要靠人肉维护:每个调用点都得自己判空,每个返回处都得确保不漏掉 null 分支。别指望注释能拦住 bug,运行时检查才是底线。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











