PHP中使用命名参数跳过默认值后传递可变参数的方法咨询
PHP命名参数配合可变长度参数的调用问题
函数与枚举定义
现有如下PHP函数:
function foo(string $domain, string $streamId, string $app = 'live', TypeEnum ...$type) {}
对应的枚举类定义:
enum TypeEnum: string { case Flv = 'flv'; case M3u8 = 'm3u8'; case Rtmp = 'rtmp'; }
常规调用方式
已知可以通过以下方式向可变长度参数...$type传递两个枚举值:
foo('domain', 'stream id', 'live', TypeEnum::Flv, TypeEnum::M3u8);
需求与错误尝试
由于$app参数有默认值,希望使用命名参数跳过该参数,但尝试的几种写法均报错:
// 错误:命名参数后未指定参数名称 foo('domain', 'stream id', type: TypeEnum::Flv, TypeEnum::M3u8); // 错误:直接传数组不符合TypeEnum类型要求 foo('domain', 'stream id', type: [TypeEnum::Flv, TypeEnum::M3u8]); // 错误:重复使用同一个命名参数 foo('domain', 'stream id', type: TypeEnum::Flv, type: TypeEnum::M3u8);
正确调用方式
要跳过$app并给...$type传递多个值,需要结合展开运算符(...),将包含枚举值的数组展开后通过命名参数传递:
foo('domain', 'stream id', type: ...[TypeEnum::Flv, TypeEnum::M3u8]);
原理:可变长度参数...$type本质是接收多个独立的TypeEnum类型参数,通过...展开数组,能将数组中的每个元素作为独立参数绑定到$type,既符合参数类型要求,又能直接跳过有默认值的$app参数。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

