PHP函数调用如何不重复代码实现可选参数正确传参
PHP可选参数传null不触发默认值的解决方案
PHP原生语法不支持在参数位直接让表达式返回null时等效于「省略该参数」,不需要写重复的分支调用,可根据场景选以下两种落地方案:
方案1:调整函数签名,内部归一化null值(推荐,成本最低)
PHP的参数默认值仅在对应位置完全不传值时生效,显式传null不会触发默认值,直接把可选参数的类型声明兼容null,在函数内部把null转为默认值即可,和不传参数的运行效果完全一致,phpstan也不会报类型错误:
// 修改后的函数定义 myfunction(string $parameter, array|null $optionalParameter = null) { // 入参为null(包括显式传null、完全不传参两种场景)时,统一用默认空数组 $optionalParameter ??= []; // 原有业务逻辑不变 }
多可选参数场景下,每个可选参数都按这个模式处理即可,不需要改动任何已有调用逻辑。
方案2:用参数展开动态构造传参列表(适合无法修改目标函数签名的场景)
如果要调用的是第三方函数、没法修改对方的签名,可以先把必传参数按顺序存入数组,满足条件时再把可选参数追加到数组中,最后用...展开运算符传参,没有追加的参数位置就会自动走默认值:
// 先按参数顺序放入必传值 $callArgs = ['text']; // 满足传参条件时,再把对应可选参数按顺序追加进数组 if (/* 你原本的判断条件,即BOOL表达式的值 */) { $callArgs[] = $array; } // 展开数组传参 myfunction(...$callArgs);
多可选参数场景下,只需要按函数定义的参数顺序逐个判断是否追加即可,不需要写多套重复的函数调用语句,冗余度极低。
注意:你原来调用时写的
BOOL ?? $array属于空合并运算符的误用,空合并运算符仅会在左侧变量未定义或值为null时返回右侧内容,只要BOOL是已定义的布尔值(无论true/false),都会直接返回BOOL本身,不会走到$array的分支,如果要做条件判断请使用三元运算符或普通if判断。
内容的提问来源于stack exchange,提问作者Rilves
相关产品推荐
相关产品推荐

