PHP 8.1中带可选参数的方法为何触发ArgumentCountError?
问题原因
PHP的参数解析逻辑中,如果某个带默认值的参数后面跟着必填参数(无默认值),即便使用命名参数跳过该带默认值的参数,PHP仍会判定你未传递该参数,进而抛出ArgumentCountError。
你的方法签名里,$subject带有默认值,但它后面的$callback是必填参数(无默认值),这种参数顺序导致:即使通过命名参数传递了condition和callback,PHP依然要求你必须显式传递$subject,哪怕它的默认值是null。
解决方案
有两种可行的解决方式:
- 调整参数顺序(推荐):将必填的
$callback移到$subject前面,让带默认值的参数放在参数列表末尾,符合PHP参数定义的最佳实践:
这样调用时无需传递public static function if(mixed $condition, \Closure $callback, mixed $subject = null)$subject,直接使用命名参数即可:CLASS::if(condition: is_numeric(...), callback: do_something(...)); - 显式传递默认值:如果不想调整参数顺序,调用时显式指定
$subject为默认值null:CLASS::if(condition: is_numeric(...), subject: null, callback: do_something(...));
内容的提问来源于stack exchange,提问作者Jay Bienvenu
相关产品推荐
相关产品推荐

