启用严格类型后,DocBlock类型提示是否已冗余?
你这种情况我太熟悉了——给老代码库加完原生类型提示后,看着一堆重复的DocBlock类型,确实会纠结要不要留。结论是:不是完全冗余,但可以根据PHP7.2的特性和你的实际需求做针对性精简,下面具体说:
复杂/泛型类型依然需要DocBlock
PHP7.2还不支持原生泛型,如果你有array<int, User>这种带元素类型约束的数组,或者iterable<Order>这种可迭代对象,原生类型只能写array或iterable,没法表达内部元素的类型。这时候DocBlock里的@param array<int, User> $users就是静态分析工具(比如PHPStan、Psalm)做精准检查的关键,能帮你排查数组元素类型不匹配的问题。联合/多类型场景依赖DocBlock补充
PHP7.2没有原生联合类型(要到PHP8.0才引入),如果你的方法参数允许string|int $id,或者返回值是string|bool这类多类型组合,原生类型根本没法直接声明,DocBlock里的@param string|int $id就必须保留,不然静态分析和其他开发者都没法准确知道类型范围。哪怕是PHP7.1支持的nullable类型?User,搭配DocBlock里的@return User|null 返回匹配ID的用户,未找到则返回null,也能更清晰地传达业务逻辑。可读性与上下文说明不能丢
即使原生类型已经覆盖了基础类型,DocBlock里的描述+补充说明依然能大幅提升代码可读性。比如@throws InvalidArgumentException 当传入的ID为负数时抛出,这类信息是原生类型没法表达的,不管是团队协作还是你自己过几个月回头看代码,这些上下文信息都会帮你省很多时间。可以精简重复的单一类型提示
如果DocBlock里的类型和原生类型完全一致(比如原生参数是string $name,DocBlock里@param string $name),这种重复的类型声明确实可以删掉,只保留DocBlock里的描述、@throws、@deprecated、@see这些有价值的额外信息,既能减少维护工作量,又不会丢失关键的文档内容。静态分析工具的兼容性考量
很多现代静态分析工具会同时结合原生类型和DocBlock信息做深度分析,即使原生类型存在,DocBlock里的更精确类型能让工具做更细致的检查。比如原生返回array,DocBlock写@return array<string, mixed>,工具就能检查数组键的类型是否符合预期,这是原生类型做不到的。
总结一下:PHP7.2的原生类型系统还不够完善,DocBlock类型提示在处理复杂类型、联合类型时依然不可替代;但对于单一、简单的类型,可以删掉重复的DocBlock声明,专注保留有价值的文档和补充类型信息,平衡维护成本和代码质量。
内容的提问来源于stack exchange,提问作者Sander Toonen

