phpstan v2必须手动配置level和paths,否则默认仅扫描src/且level 0几乎不报错;v2配置格式与v1不兼容,需用parameters块,level 5为实用起点,能捕获类型不匹配、空数组访问等常见问题。

PHP 8.3 + PHPStan v2 必须手动配 level 和 rules,否则默认只扫 src/、level 0 几乎不报错——这等于没开静态分析。
确认 PHPStan 版本与 PHP 8.3 兼容
PHPStan v2 要求 PHP ≥ 8.0,但 v2.0+ 对 PHP 8.3 的动态属性弃用、类常量类型强制等新行为有适配;v1.x 在 PHP 8.3 下会因 Class "PHPStan\..." not found 或配置解析失败直接退出。
- 运行
php -v确认是8.3.x - 执行
composer require --dev phpstan/phpstan:^2.0(别用^1.10) - 若项目含 Laravel/Symfony,加
--with-all-dependencies避免 autoload 冲突
写对 phpstan.neon:paths、level、ignoreErrors 缺一不可
v2 的配置格式和 v1 完全不兼容:includes 和 autoload_directories 在 v2 中无效,必须用 parameters 块;漏掉 paths 就只扫 src/,漏 level 就卡在 level 0。
- 在项目根目录建
phpstan.neon,内容至少包含: parameters:-
level: 5(level 0–9,5 是实用起点,能捕获空数组访问、类型不匹配、未定义方法调用) -
paths: -
- src/ -
- tests/ -
ignoreErrors: -
- '#Call to an undefined method#'(可选,先忽略历史问题)
启用 PHPStan Strict Rules(非自动,需显式 include)
PHPStan v2 不自带严格规则,phpstan/phpstan-strict-rules 是独立扩展包,安装后不会自动生效——必须在 phpstan.neon 中 includes 才触发。
- 执行
composer require --dev phpstan/phpstan-strict-rules - 修改
phpstan.neon,顶部加一行:includes: - vendor/phpstan/phpstan-strict-rules/rules.neon - Strict Rules 强制:
in_array($x, $y, true)第三参数必须为true,if ($x)中$x必须是布尔值,+运算符左右必须为数值——这些在 PHP 8.3 动态属性警告、类常量类型检查背景下尤其关键
PHP 8.3 特有陷阱:动态属性与 strict_types 影响分析结果
PHPStan v2 能识别 PHP 8.3 新语法,但不会主动报 #[AllowDynamicProperties] 缺失或 declare(strict_types=1) 缺失——它只检查你声明的类型,不强制你加声明。这意味着:
- 没加
#[AllowDynamicProperties]的类里出现$obj->foo = 'bar',PHP 运行时报E_DEPRECATED,但 PHPStan 默认不报(除非你启用了phpstan/phpstan-deprecation-rules) - 函数参数写了
string $s但没加declare(strict_types=1),PHPStan 仍按类型声明检查,但实际运行时可能隐式转换——这种“检查与执行不一致”要靠团队约定+CI 拦截 - 类常量如
public const VERSION = '1.0'在 PHP 8.3 直接 fatal,PHPStan v2.0.10+ 能检测到并提示Missing type in constant declaration,但前提是 level ≥ 5 且没被ignoreErrors屏蔽
真正难处理的是混合场景:一个旧类既没 #[AllowDynamicProperties] 又没 declare(strict_types=1),还用了松散比较,这时得靠 phpstan.neon 里分路径设不同 level 或加自定义规则,而不是指望一键开全。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











