phpstan必须本地安装,全局安装会导致配置不加载、类找不到、扫描静默失效;正确做法是在含composer.json的项目根目录执行composer require --dev phpstan/phpstan,配置文件须为phpstan.neon且置于根目录,laravel项目还需额外安装phpstan/phpstan-laravel和phpstan/extension-installer。

PHPStan 必须本地安装,全局安装会导致配置不加载、类找不到、扫描静默失效——这不是 bug,是设计使然;自动化流程能否跑通,取决于三件事:安装路径对不对、配置文件名和位置对不对、autoload 链路通不通。
composer require --dev phpstan/phpstan 必须在项目根目录执行
命令必须在含 composer.json 的项目根目录运行,否则 vendor/bin/phpstan 不会生成,后续所有命令都失败。
- 子目录(如
src/或app/)里执行该命令:不会报错,但实际装到子目录的vendor/下,主项目根本用不到 - 已存在旧版锁定(如
"phpstan/phpstan": "^0.12"):手动改composer.json里的版本为"^1.10"或"^2.0",再运行composer update phpstan/phpstan - 误用过
composer global require phpstan/phpstan:先执行composer global remove phpstan/phpstan,再回到项目根目录重装 - Laravel 项目只装
nunomaduro/larastan:不行,larastan是扩展包,不是可执行主体,必须同时装phpstan/phpstan
phpstan.neon 文件名、位置、缩进一个都不能错
PHPStan 不会提示“配置没读到”,它只会安静 fallback 到 level 0 + 只扫 src/ + 跳过所有 autoload 映射。最快速验证方式是加 --debug:
- 文件名必须是
phpstan.neon(不能是phpstan.yaml、.neon、phpstan.neon.dist),且放在项目根目录 - 必须包含
parameters:块,level和paths必须在其下缩进(推荐 2 空格,YAML 对空格敏感) -
paths默认只扫src/;Laravel 项目要显式加- app/、- database/、- routes/,否则直接跳过 - 纯函数文件(如
src/helpers.php)无命名空间:必须写autoload_files: ["src/helpers.php"],否则函数调用全标为undefined
运行 vendor/bin/phpstan analyse --debug,检查输出中:
• Loaded configuration 是否指向你写的 phpstan.neon
• Scanning files in 后列出的路径是否含你预期的文件(如 app/Models/User.php)
• 是否有 Using bootstrap file: vendor/autoload.php —— 没这行说明 autoload 链路断了
Laravel 项目必须补全两层扩展支撑
默认 phpstan analyse 在 Laravel 里报一堆 Call to undefined method,不是 PHPStan 有问题,是它不认识 Facade、模型属性、容器绑定这些运行时特性。
- 必须装三个包:
phpstan/phpstan(核心)、phpstan/phpstan-laravel(官方 Laravel 扩展)、phpstan/extension-installer(自动加载扩展,漏装等于白装) -
phpstan.neon中必须写includes: - vendor/phpstan/phpstan-laravel/extension.neon,不写就不会启用 Laravel 规则 - 关键参数要显式声明:
scanModels: true(推断 Eloquent 属性)、dynamicConstantNames: [APP_DEBUG, APP_ENV](识别 Laravel 常量) - 若用
database/factories/*.php,需加进autoload_files,否则工厂类无法被解析
CI 环境里失败 90% 是环境链路断裂,不是 PHPStan 本身问题
GitLab CI 或 GitHub Actions 里 phpstan analyse 报错,优先排查这三点:
-
phpstan.neon被.gitignore忽略了(常见于模板项目) -
composer install --no-dev跳过了dev依赖,导致phpstan根本没装 - 工作目录不是项目根目录(如
cd /builds/group/project/src再运行命令) - PHP 版本不匹配:代码用了
string|null,但phpstan.neon里没设phpVersion: 80100,PHPStan 就不校验联合类型
真正麻烦的不是装不上,而是装上了却以为它在检查——结果漏掉 scanFiles、配错 phpVersion、或误信全局安装能跨项目生效。这些点不手动验证一次,CI 里根本看不出问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











