PHP 本身不支持泛型,但可通过 PHPDoc 的 @template 注解配合 PHPStan、Psalm 和 PhpStorm 实现泛型语义:@template T 声明类型参数,@param T $x 和 @return array 等标签引用以实现类型推导与智能提示,需注意工具兼容性及正确上下文约束。

PHP 本身不支持泛型(如 T、array<t></t>),但 PHPStan、Psalm 和现代 IDE(如 PhpStorm)可通过 PHPDoc 注解理解泛型语义。PHP 8.0+ 虽未引入语言级泛型,但其类型系统增强(如联合类型、static 返回、模板化注解)让 PHPDoc 泛型标注更可靠、更易被工具识别。
使用 @template 声明泛型类型参数
这是 PHPDoc 泛型标注的核心。它告诉静态分析工具:这个类/方法/函数有一个可变的类型占位符。
- 必须放在类、接口、trait 或函数的 PHPDoc 块顶部(紧贴声明前)
- 语法为
@template T,可带约束:@template T of iterable或@template TKey of array-key - 支持多个泛型:
@template T@template U of string
示例:
/*** @template T
* @template U of string
*/
class Mapper { /* ... */ }
?>
在类型声明中引用泛型(@param、@return、@var)
声明后即可在其他 PHPDoc 标签中使用泛型名,实现“类型传递”效果。
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
@param T $value表示参数类型与声明的T一致 -
@return array<t></t>表示返回值是T类型元素的数组 -
@return self<t></t>在泛型类中表示返回相同泛型实例(需配合@template类级声明) - 支持嵌套和组合:
array<string array t>></string>、T|null
示例(泛型方法):
/*** @template T
* @param array
* @return T
*/
function first(array $items): mixed {
return $items[0] ?? null;
}
?>
用 @extends、@implements、@uses 传递泛型上下文
当继承/实现泛型类或接口时,需显式指定泛型实参,否则工具无法推断子类的类型关系。
-
@extends Collection<user></user>—— 子类固定泛型为User -
@extends Collection<t></t>—— 子类保持父类泛型(需先声明@template T) @implements IteratorAggregate<string product></string>-
@uses HasTimestamps<t></t>(用于 trait 使用场景)
示例:
/*** @template T
* @extends ArrayObject
*/
class TypedArray extends ArrayObject {}
?>
注意兼容性与工具差异
不同工具对 PHPDoc 泛型的支持程度略有不同,实际编写时需兼顾。
- PHPStan(v1.10+)完整支持
@template、@extends泛型推导,推荐开启phpstan.neon中的checkGenericClassInNonGenericObjectType: true - Psalm 使用
@psalm-template(兼容@template),但对self<t></t>推断更严格,建议优先用@psalm-return static<t></t> - PhpStorm 基于 PHPStan 规则解析,支持跳转、补全、类型提示,但不校验约束(如
of Traversable) - 避免在
@var中单独写@var T(无上下文),应配合@template声明或明确作用域(如方法内@var T $x)


















