composer仅安装扫描工具,phpstan/psalm负责实际扫描;配置文件须在根目录且命名正确,paths需显式指定代码路径,autoloader需手动配置,vendor扫描应精准而非全量,ci中须确保本地安装和正确工作目录。

Composer 本身不扫描代码,它只负责装工具;所谓“全项目扫描”,实际是靠 PHPStan 或 Psalm 这类工具完成的,而 Composer 只是把它们拉进 vendor/bin/ 并提供脚本入口。
PHPStan 扫不到你的代码?先确认配置文件和路径
最常见的情况是 phpstan.neon 放错位置或内容不全:它必须在项目根目录,且不能叫 phpstan.yaml 或 .neon;必须有 parameters: 块,且 level 和 paths 缩进正确(YAML 对空格敏感,推荐 2 空格)。如果你的代码在 app/ 或 lib/ 下,paths 里就得显式写上:
- app- lib-
- src(如果还有)
执行 vendor/bin/phpstan analyse --debug 能看到它实际加载了哪些文件——这是验证配置是否生效的最快方式。别依赖“没报错=扫完了”,它可能根本没读到你的目录。
Psalm 初始化后仍报 Class not found?autoloader 没接上
Psalm 默认不读 composer.json 的 autoload 字段,所以即使你写了 "MyApp\": "app/",它照样不认识 MyAppFoo。解决方法有两个:
- 在
psalm.xml的<projectfiles></projectfiles>下手动加<directory name="app"></directory> - 在
composer.json的 scripts 里加--load-from=.参数,比如:"psalm": "vendor/bin/psalm --load-from=."
如果用了非标准加载(如 include_once 'helpers.php'),还得在 psalm.xml 里用 <file></file> 显式引入,否则函数调用直接跳过分析。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
想扫 vendor 里的依赖?别全量,要精准控制
PHPStan 默认跳过 vendor/,这是对的——第三方包质量参差不齐,全扫只会让 CI 卡死或堆满误报。真要查某个关键依赖(比如你 fork 的 SDK),得手动加路径:
- PHPStan:在
phpstan.neon的paths下加- vendor/myorg/private-sdk/src,并确保该包的composer.json里autoload正确,否则报Class not found - Psalm:在
psalm.xml的<projectfiles></projectfiles>下加<directory name="vendor/myorg/private-sdk/src"></directory>,再配<issuehandlers></issuehandlers>抑制已知噪音(比如@deprecated方法) - 级别别拉太高:对第三方代码,
level: 3(PHPStan)或errorLevel="4"(Psalm)起步更现实,level: 7+在老包里基本不可用
真正难的不是加工具,而是判断“扫谁”和“信谁”。盲目扫整个 vendor/,不如盯住你改过、或处在核心调用链上的那两三个包。
CI 里跑不起来?检查安装方式和工作目录
全局安装 phpstan/phpstan 在 CI 里大概率失败——配置不加载、类找不到、甚至静默跳过扫描。必须本地安装:composer require --dev phpstan/phpstan,且 phpstan.neon 在根目录。
另一个高频坑是工作目录不对:CI 脚本如果 cd 进子目录再跑 composer run analyse,工具会从子目录找配置,结果找不到 phpstan.neon,就 fallback 到默认行为(只扫 src/,level: 0)。解决方案很简单:
- 所有 CI 脚本开头加
cd $PROJECT_ROOT(或等效操作) - 或者在 scripts 中强制指定配置:
"phpstan": "phpstan analyse --configuration=phpstan.neon"
复杂点永远不在工具本身,而在路径、加载顺序、和你对“当前目录”的假设是否一致。










