PHP函数调用中如何跳过默认命名参数传递可变参数?
PHP 保留默认标志参数时调用含可变参数的dbQuery方法
问题背景
原有dbQuery方法新增了末尾的可变参数...$params以支持传入绑定值,同时要求保留原有接口的默认参数,现在需要找到正确的调用方式来传入$params且不破坏默认参数的使用。
正确调用方式
1. 所有标志参数使用默认值
直接在查询字符串后展开绑定值数组,可变参数会自动接收数组中的每个元素:
->dbQuery('my query', ...[1, 2, 3]);
此时$flag1=false、$flag2=SOME_DEFAULT、$flag3=false,$params = [1, 2, 3]。
2. 部分标志参数需要自定义值
如果要修改部分标志参数,同时保留其他默认值,可按位置传递自定义的标志参数,再展开绑定值数组:
// 仅修改$flag1为true,其余标志用默认值 ->dbQuery('my query', true, SOME_DEFAULT, false, ...[1, 2, 3]);
PHP 8.0及以上版本支持命名参数,可更清晰地指定需要修改的标志,再展开绑定值:
->dbQuery('my query', flag1: true, ...[1, 2, 3]);
这里命名参数指定$flag1,其余标志自动使用默认值,后续展开的数组元素会被$params接收。
为什么之前的尝试无效
->dbQuery('my query', params: [1, 2, 3]);:命名参数params会将整个数组作为单个元素传入可变参数,导致$params = [[1, 2, 3]],不符合需求。->dbQuery('my query', params: ...[1, 2, 3]);:PHP不支持命名参数与展开运算符...结合使用,语法本身非法。->dbQuery('my query', ...['params' => [1, 2, 3]]);:展开关联数组时仅会传递其值部分,本质还是将单个数组传入$params,结果与第一种错误情况一致。
内容的提问来源于stack exchange,提问作者Alex Dawn
相关产品推荐
相关产品推荐

