phpstan 必须本地安装,因其配置加载、扩展发现和规则注册均依赖 composer 自动加载及 vendor 目录结构;全局安装会导致配置被忽略、扩展无法自动发现、版本冲突及扫描失效。

PHPStan 不能通过 Composer 全局安装来用于项目级静态分析——必须按项目本地安装,否则 phpstan analyse 会找不到配置、报错或静默跳过文件。
为什么必须用 composer require --dev phpstan/phpstan
PHPStan 的配置加载、扩展发现、规则注册都依赖于 Composer 的自动加载机制和 vendor/ 下的包结构。全局安装(composer global require phpstan/phpstan)会导致:
-
phpstan.neon或phpstan.neon.dist文件被忽略,因为 PHPStan 启动时只在当前项目根目录找配置 - 自定义规则、扩展(如
phpstan-deprecation-rules)无法被自动发现,除非手动写autoload_files,极易出错 - 不同项目需要不同 PHPStan 版本(如 v1.10 vs v2.0),全局安装锁死版本,协作时容易踩坑
phpstan analyse 执行时没报错但没检查任何文件
这是最常被忽略的配置问题:PHPStan 默认只扫描 src/ 目录,且要求文件后缀为 .php 并有可解析的命名空间或类声明。常见原因:
- 项目代码在
app/或lib/下,但没在phpstan.neon中配置paths: - 文件是纯函数式脚本(无
class、interface、namespace),PHPStan v1.10+ 默认跳过,需加scanFiles:显式指定 -
autoload没配好,导致 PHPStan 加载失败类引用,直接静默跳过整个文件
最小可用配置示例:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
parameters:
level: 5
paths:
- src
- tests
scanFiles:
- index.php
- public/index.php
PHPStan 和 PHP 版本、类型声明的兼容性陷阱
PHPStan 的检测能力高度依赖你写的类型信息和目标 PHP 版本。比如:
- 用了
#[\Override]属性但 PHPStan 版本 Unknown attribute 错误 - 代码里写了
string|null联合类型,但phpstan.neon中phpVersion设成7.4,PHPStan 就不会校验该联合类型合法性 - 启用了
strict-rules扩展,但项目里大量@var注释没写完整类型(如@var array缺少键值类型),会批量报Variable type could not be inferred
推荐做法:在 phpstan.neon 里显式声明
parameters: phpVersion: 80100 # 对应 PHP 8.1.0,避免靠环境猜
真正麻烦的不是装不上,而是装上了却以为它在检查——结果漏掉 scanFiles、配错 phpVersion、或误信全局安装能跨项目生效。这些点不手动验证一次,CI 里根本看不出问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










