php 7 不支持 string|int 联合类型,因解析器遇 | 直接报错;需用 @param string|int 注释配合 is_string()/is_int() 运行时校验,禁用 ?string 或 string|null 等非法写法。

PHP 7(含7.4)不支持 string|int 这类联合类型语法,直接使用会触发解析错误(Parse error: syntax error, unexpected '|'),必须改用运行时类型校验 + 文档注释替代。
为什么 PHP 7 不能写 string|int
联合类型是 PHP 8.0 才正式引入的语法特性。PHP 7.x 系统解析器遇到 | 符号会直接报错,不会进入运行时阶段——也就是说,连文件都加载不了,更别说执行逻辑了。即使你启用了 strict_types=1,它也只管标量类型强制匹配,不识别联合结构。
PHP 7 中模拟 string|int 的三种可行做法
目标不是“骗过解析器”,而是让调用方清楚约束、让运行时能拦截非法值、让 IDE 和静态分析工具(如 PHPStan、Psalm)仍能提供一定提示:
- 用
@param string|intPHPDoc 注释声明意图,配合is_string()和is_int()手动校验 - 函数入口处统一做类型判断并抛出
InvalidArgumentException,例如:if (!is_string($value) && !is_int($value)) { throw new InvalidArgumentException('Expected string or int, got ' . gettype($value)); } - 避免在返回值位置“假装”联合类型:PHP 7 不支持
: string|int,只能去掉返回类型声明,靠文档和单元测试保障
string|int 和 ?string 在 PHP 7 中的混淆陷阱
有人试图用 string|null 或 ?string 模拟“可选字符串”,但这和 string|int 完全无关——前者是「空或字符串」,后者是「字符串或整数」。更危险的是,在 PHP 7 中写 ?string 也会报错(可空类型也是 PHP 7.1+ 属性、PHP 7.4+ 参数才支持,且仅限单类型前缀)。所以:
-
?string在 PHP 7.0–7.3 中非法,不要写 -
string|null同样非法,且语义错误(这不是联合类型,PHP 7 也不认) - 若真需要接受
string、int或null,PHP 7 唯一务实做法是声明为无类型参数,内部用is_null()+is_string()+is_int()三重判断
最易被忽略的一点:PHPDoc 中的 @param string|int 不会触发运行时检查,它只是注释;如果你依赖 Psalm 或 PHPStan,得确保它们的配置开启了联合类型注释解析(如 Psalm 的 phpVersion="7.4" 不行,得设为 "8.0" 才认 string|int 注释),否则连静态提示都会失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











