【问题标题】:How to write a function with an optional argument and variable length arguments?如何编写带有可选参数和可变长度参数的函数?
【发布时间】:2019-03-29 15:22:41
【问题描述】:

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

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

其中$dir 是默认参数,$field 是使用 (...) 标记的可变长度参数。

问题是可变长度参数必须在最后声明,当我这样做时,开发人员不能将第一个参数跳过为其默认值。我该如何解决这个问题?

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

【问题讨论】:

  • 只需使用...$fields,并以编程方式处理方法内第一个参数的默认值。然后,为解释方法签名的方法编写一个好的 PHPDoc。
  • 您可以创建一个“MethodArguments”类,该类将这两个参数作为属性,其中可变长度在构造函数中传递,默认具有设置函数。但这一切都取决于你想变得多严格。
  • @cale_b , ...$fields 是一个单独的参数,我希望开发人员知道应该为哪个参数分配哪个值。
  • @cale_b 让我更新我的示例代码,以便您更好地了解这个概念
  • @cale_b 我​​更新了示例。 $dir 是排序方向,可以是“asc”或“desc”,$fields 是列的列表。

标签: php function variadic-functions default-arguments


【解决方案1】:

这根本不可行。 PHP 不支持这一点,而且它没有多大意义。唯一可行的方法是使用命名参数,就像在其他一些语言中一样,使参数顺序无关紧要。

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

例如:

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

更简洁,更易于方法用户理解,并且符合语言语法。

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

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

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

【讨论】:

  • 我知道我可以使用数组而不是可变长度参数。但这样一来,函数调用就会更加复杂。顺便说一句,正如你所说,根据我自己的研究,我认为没有办法像我的例子那样做到这一点。谢谢你的回答。
  • 谢谢,但这不是我的答案。但它基本上是正确的,所以我会投票,但我不会删除我的问题,也许有一天有人会有另一个解决方案/答案。
【解决方案2】:

我想做的是:

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

当我不想要前两个参数时,“逻辑”函数调用是:

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

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

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

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

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

不理想,但它有效。在正常使用中,将使用变量指定的idclass 调用该函数。就我个人而言,我看不出将可变参数和可选参数结合起来有什么不圣洁的地方……但你必须要小心一点!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多