phpstan 和 psalm 都是成熟的 php 静态分析工具,选择取决于项目对类型系统的严格程度、配置复杂度以及团队偏好。若追求开箱即用、快速集成且对复杂类型推断要求不高,首选 phpstan;若需要更严格的类型检查、支持泛型及复杂的代码流分析,则推荐 psalm。两者均能显著提升代码质量,但配置策略和规则集差异较大。

PHPStan 的核心优势与基础配置
PHPStan 以“零配置”启动著称,默认规则集(Default)即可捕获常见错误,适合希望快速接入 CI/CD 的项目。它通过分层分析(Levels)控制严格度,Level 0 仅检查语法和基本逻辑,Level 5 为默认推荐,能发现大部分潜在 Bug。其核心优势在于稳定性高、社区插件丰富,且对 Laravel、Symfony 等框架有良好支持。

<?php
// composer.json 中需添加:
// "require-dev": { "phpstan/phpstan": "^1.10" }
// 运行命令:vendor/bin/phpstan analyse src --level=5
// 输出示例:
// Line 10, Column 5: Parameter #1 $name of function strlen expects string, int given.
上述命令使用 Level 5 分析 src 目录,会报告类型不匹配等常见问题。PHPStan 的配置通常位于 phpstan.neon 文件中,可通过 parameters 键调整行为,例如忽略特定文件或路径。其规则集设计哲学是“保守”,避免误报,确保开发者能快速修复问题而不被过度约束。
立即学习“PHP免费学习笔记(深入)”;
Psalm 的类型系统深度与泛型支持
Psalm 提供更强大的类型推断能力,尤其擅长处理泛型、联合类型和条件类型。它支持基于代码流的精确类型收窄,能识别如 $x instanceof A ? $x->methodA() : $x->methodB() 中的分支类型。Psalm 的严格模式可检测未定义属性、非法访问等深层问题,适合大型项目或对类型安全要求极高的场景。

<?php
// composer.json 中需添加:
// "require-dev": { "vimeo/psalm": "^5.0" }
// 运行命令:vendor/bin/psalm --no-cache
// 输出示例:
// ERROR: InvalidPropertyFetch - src/User.php:10:5
// Cannot access property $email on User<string>
该命令启用缓存禁用模式,强制重新分析所有文件。Psalm 的配置在 psalm.xml 中,可通过 <issuehandlers></issuehandlers> 自定义错误级别。其泛型支持允许定义如 <t></t> 的参数化类型,提升代码复用性和安全性。相比 PHPStan,Psalm 的学习曲线稍陡,但回报是更全面的类型覆盖。
基于输入参数类型冲突的具体问题分析
当函数参数期望字符串而传入整数时,PHPStan 和 Psalm 均会报错,但错误信息粒度不同。PHPStan 报告“expects string, int given”,直接指出类型不匹配;Psalm 可能进一步提示该位置是否涉及隐式转换或类型声明缺失。这种差异源于两者对类型系统的实现方式:PHPStan 侧重运行时兼容性,Psalm 侧重静态推导完整性。



















