如何编写带有可选参数和可变长度参数的函数?

时间:2019-03-29 15:22:42

标签: php function variadic-functions default-arguments

我想在这样的类中实现一个方法:

class Query {
    public function orderBy($dir="asc", ...$fields){}
}

其中$dir是默认参数,而$field是使用(...)令牌的变长参数。

问题在于可变长度参数必须在末尾声明,而当我这样做时,开发人员无法将第一个参数跳过为其默认值。我该如何解决?

请注意,我不想使用func_get_args(),因为我希望开发人员具有一些类型提示。

2 个答案:

答案 0 :(得分:1)

这根本不可行。 PHP不支持此功能,因此也没有太大意义。唯一可行的方法是像在其他语言中一样,通过命名参数来使参数顺序无关紧要。

此外,您对此处使用可变参数的要求是人为的,不是很有用。只需使用数组和可选的order参数即可。

例如:

function orderBy(array $columns, string $order = 'asc') {
    // do your thing
}

更整洁,使方法用户更容易理解,并且符合语言语法。

如果您希望它看起来与可变参数函数“相似”,只需使用如下语法调用该方法:

orderBy(["column1", "column5"]);

orderBy(["column2"], 'desc');

答案 1 :(得分:0)

我想做的是:

function tableHead($id=NULL, $class=NULL, ...$columnsHeads)

当我不希望使用前两个参数时,“逻辑”函数调用为:

tableHead( , , "Dogs","Cars","Sausages");

不幸的是,PHP不允许您使用,作为空默认值。我通过将NULL, NULL,作为前两个参数来解决这个问题。不理想,但现在可以!

(我确定20年前我曾使用某种语言的空,发送一个空值-有人知道吗?还是只是一厢情愿?)

我的解决方案(哈哈)是:

tableHead(NULL, NULL, "dogs","cars", "sausages");

不理想,但是可以。在正常使用情况下,将使用由变量指定的idclass来调用该函数。就个人而言,我看不到将可变参数和可选参数组合在一起的任何邪恶……但是您必须要小心一点!