如何在PHPStan文档注释中将Callable参数传递至Baz的$params?
解决PHPStan类型不匹配问题:通过文档注释关联Callable参数与命名参数数组
首先明确问题核心:你的Bar::baz方法原注释用单个模板类型定义回调参数,导致PHPStan认为回调可接受任意TParam联合类型的可变参数,但实际传入的闭包是固定类型的有序参数,且你希望以命名参数数组形式传参,这就引发了类型校验冲突。
解决方案:用PHPStan命名参数数组类型标注修正接口注释
修改Bar接口的文档注释,通过模板关联回调的命名参数与$params数组结构,让PHPStan识别两者的匹配关系:
interface Bar { /** * @template TResult of mixed * @template TParams of array<string, mixed> * * @param callable $callable 接受命名参数的回调函数 * @param TParams $params 关联数组形式的命名参数集合 * * @phpstan-param callable(**TParams): TResult $callable * @phpstan-return TResult */ public function baz(callable $callable, array $params): mixed; }
关键细节说明
**TParams是PHPStan专属语法,用于标注回调函数接受TParams关联数组作为命名参数传入@template TParams of array<string, mixed>定义参数数组模板,确保$params是字符串键的关联数组- 修改后PHPStan会自动校验:
$params的键名与回调参数名完全匹配$params中每个值的类型与对应参数类型一致- 可选参数可省略(比如你的
?bool $c = null,不传'c'键也不会报错)
验证调用代码
原有调用代码无需修改,PHPStan会正确识别闭包参数与$params的匹配关系,不再抛出类型错误:
/** @var Bar $bar */ $bar = '...'; $bar->baz( fn( int $a, float $b, ?bool $c = null ) => $a, [ 'a' => 1, 'b' => .1, 'c' => null ] );
配套实现提示
确保baz方法内部确实通过命名参数方式调用回调,比如:
public function baz(callable $callable, array $params): mixed { return $callable(...$params); // 展开关联数组作为命名参数传入 }
内容的提问来源于stack exchange,提问作者Jan Hanáček
相关产品推荐
相关产品推荐

