PHPStan专注类型安全与逻辑正确性,不检查代码规范;Laravel项目必须用Larastan扩展,并配齐bootstrapFiles、paths和includes三项,否则类型推断失效。

PHPStan 不是用来“检查代码规范”的工具,它专注类型安全与逻辑正确性;想管缩进、空格、命名风格,得用 PHPCS 或 PHP_CodeSniffer —— 混用或误配会导致配置失效、报错失焦。
为什么 phpstan.neon 里写 phpcs 规则没用
PHPStan 解析的是抽象语法树(AST)并做类型推导,它根本不读 phpcs.xml,也不关心 if ($a==1) 是否该写成 if ($a === 1)。它的报错全是形如 Parameter #1 of Foo::bar() expects string, int given 这类类型契约断裂问题。
- PHPCS 负责检查
if后是否少空格、function前是否有空行、变量名是否驼峰 - PHPStan 负责发现
$user->getName()调用时$user实际是null或stdClass - 两者可共存,但必须分装:PHPCS 走
phpcs --standard=PSR12,PHPStan 走phpstan analyse
PHPStan 真正能帮你守住的“规范”边界
它强制你写出可推断、可验证的类型契约,间接推动三类关键实践落地:
- 所有公共方法必须有明确返回类型声明(
public function getId(): int),否则 level 6+ 直接报错 - 数组/集合必须标注元素类型,比如
/** @var array<int user> $users */</int>,否则checkMissingIterableValueType: true会警告 - 第三方调用(如
config('app.debug'))需配合 stub 或@var注解,否则 PHPStan 当成mixed导致后续访问全标红
Laravel 项目里最容易配错的三项
裸 PHPStan 在 Laravel 中基本不可用,必须用 Larastan 扩展,且以下三项漏一不可:
立即学习“PHP免费学习笔记(深入)”;
-
bootstrapFiles: ['vendor/autoload.php']—— 不加这行,App\Models\User根本不被识别,全当class@anonymous -
paths: ['app/', 'database/']—— 只写src/?那模型、迁移、服务提供者全跳过,Eloquent 关系类型全丢失 -
includes: [- vendor/larastan/larastan/extension.neon]—— 注意开头是短横-,不是./或绝对路径,写错等于没加载扩展
真正难的不是写配置,而是让团队接受:类型注解不是装饰,是契约。一个没写 @var 的 $data = json_decode($json),在 level 6 下会连锁导致十几处属性访问报错 —— 修复点不在报错行,而在源头声明。



















