在函数调用中设置命名变量参数时如何跳过默认命名参数?

问题描述 投票:0回答:1

我有一个现有的方法:

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/variadicshttps://wiki.php.net/rfc/named_params

虽然在后来的 RFC 中明确表明了可变参数之前的默认命名参数是有效的签名,但没有说明如何访问可变参数。

php arguments default variadic-functions named-parameters
1个回答
0
投票

第一眼就爱上了命名参数,但我没有找到一种方法可以用可用的语法来实现你所寻求的目标。

我的意思是,即使您将参数数组传递给保护函数,该函数扩展数组并使用类型提示,您也可能会在非标量值上触发致命错误,但是布尔值将合并为整数.

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 数组分散到下一个方法调用中,并允许它抱怨不适当的数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.