我有一个现有的方法:
public function dbQuery(
string $query,
bool $flag1 = false,
int $flag2 = SOME_DEFAULT,
bool $flag3 = false
)
现在我想对其进行调整,以便可以将绑定值作为可变参数传递,但不会破坏当前接口(我知道 arg 标志是一种反模式),即:
public function dbQuery(
string $query,
bool $flag1 = false,
int $flag2 = SOME_DEFAULT,
bool $flag3 = false,
mixed ...$params
)
如何在传入参数的同时保留默认标志的同时调用 dbQuery?
我已经尝试过:
->dbQuery('my query', params: [1, 2, 3]);
但它作为第一个 vardic arg 中的数组出现,例如$params = [[1, 2, 3]]
->dbQuery('my query', params: ...[1, 2, 3]);
是无效语法->dbQuery('my query', ...['params' => [1, 2, 3]]);
与选项 1 相同的结果没有任何与此用法完全一致的内容显示在: https://wiki.php.net/rfc/variadics 或https://wiki.php.net/rfc/named_params
虽然在后来的 RFC 中明确表明了可变参数之前的默认命名参数是有效的签名,但没有说明如何访问可变参数。
我第一眼就爱上了命名参数,但我没有找到一种方法可以用可用的语法来实现你所寻求的目标。
我的意思是,即使您将参数数组传递给保护函数,该函数扩展数组并使用类型提示,您也可能会在非标量值上触发致命错误,但是布尔值将合并为整数.
const SOME_DEFAULT = 1;
function validateParams(int|float|string|null ...$params) {
var_dump($params);
}
function dbQuery(string $query, bool $flag1 = false, int $flag2 = SOME_DEFAULT, bool $flag3 = false, array $params = []) {
validateParams(...$params);
var_dump(
$query,
$flag1,
$flag2,
$flag3,
$params
);
}
dbQuery(
'foo', params: ['fizz', 'buzz', false]
);
也许您可以说服接受一组参数,然后对所有元素运行验证过程,并针对不合格的有效负载抛出异常。
或者可能将 params 数组分散到下一个方法调用中,并允许它抱怨不适当的数据类型。