为何PHPStan未对传入的无效数组键报错?
为何PHPStan未对传入的无效数组键报错?
先看你的代码示例:
<?php declare(strict_types=1); /** * @param array{key?: string} $options */ function hello($options) { var_dump($options); } hello([ 'WRONG_KEY' => '...', ]);
你的疑问是:
我原本期望运行
phpstan analyze时这段代码会报错,提示传入的数组中存在未预期的WRONG_KEY,但实际并没有报错。这是因为我遗漏了某些配置,还是PHPStan本身的机制就是如此?
这其实是PHPStan的默认行为——你定义的array{key?: string}这种形状类型,默认只做「声明键的类型校验」,不会限制数组里出现额外的未知键。简单说,PHPStan认为只要传入的数组满足声明的键的要求(这里key是可选的,所以有没有都可以),其他额外的键是允许存在的。
要让PHPStan严格检查数组结构,禁止出现未声明的键,你有两种解决方式:
全局开启严格数组检查(推荐):在你的
phpstan.neon或phpstan.neon.dist配置文件中添加以下参数:parameters: strictArrays: true开启后,PHPStan会把形状类型当作精确的结构定义,任何未在类型注释里声明的键都会被检测为错误。
局部限制数组结构:如果你不想全局开启严格模式,可以在类型注释里用交叉类型明确禁止额外键:
/** * @param array{key?: string}&array<never, never> $options */ function hello($options) { var_dump($options); }这种方式通过
array<never, never>来强制数组不能有任何其他键,但写法相对繁琐,适合只需要针对个别函数做严格检查的场景。
另外要注意,确保你使用的PHPStan版本在0.12及以上,这些形状类型的严格校验特性是在这个版本之后支持的。
备注:内容来源于stack exchange,提问作者Limon Monte
相关产品推荐
相关产品推荐

