在PHP中命名的函数参数

时间:2013-10-01 22:11:01

标签: php named-parameters

php中的python是否可以使用命名函数参数?一个示例用例是:

function foo($username = "", $password = "", $timeout = 10) {

}

我想覆盖$timeout

foo("", "", 3);

难看。我宁愿这样做:

foo(timeout=3);

5 个答案:

答案 0 :(得分:5)

不,PHP中无法使用命名参数。从技术上讲,当您致电foo($timeout=3)时,它首先评估$timeout=3,结果为3,并将其作为第一个参数传递给foo()。 PHP强制执行参数顺序,因此可比较的调用需要foo("", "", $timeout=3)。您还有两个选择:

  • 让您的函数将数组作为参数并检查数组键。我个人认为这很丑,但它有效且可读。优点是简单,以后可以轻松添加新参数。缺点是你的功能不那么自我记录,你不会从IDE获得太多帮助(自动完成,快速功能参数查找等)。
  • 设置不带参数的函数,并使用func_get_args()向PHP询问参数,或使用PHP 5.6+中的... variable length arguments feature。根据参数的数量,您可以决定如何处理每个参数。很多JQuery函数都是这样做的。这很容易,但对于那些调用你的函数的人来说可能会让人感到困惑,因为它也不是自我记录的。你的论点仍未命名。

请注意,an RFC for named parameters仍在“讨论中”。

答案 1 :(得分:5)

PHP 7.*或更低版本中不支持命名参数。

但是,可能是PHP 8 https://wiki.php.net/rfc/named_params

让我们看看它如何结束投票阶段! :D

已更新:RFC已获批准。 命名参数将在PHP 8中实现。

答案 2 :(得分:5)

2020年更新的答案:PHP 8将支持命名参数,即通过的RFC。

这是什么意思?

本机函数和您当前的代码都将能够使用命名参数。

它如何工作?

假设您定义了一个函数:

function foo($a = 10, $b = 20, $c = 30) {
    return $a * $b - $c;
}

您现在可以像下面这样调用此函数:

foo(a: 30, c: 10, b: 5);
foo(5, c: 60, b: 10);
foo(c: 30, b: 20, a: 10);

答案 3 :(得分:1)

老问题,但这里有更多信息。

如其他答案中所述,PHP不直接支持命名参数。 VBA是另一种拥有这种奢侈品的语言。

在PHP中,您可以使用相当合理的替代品。 PHP的数组处理特别好,您可以使用关联数组来传递参数数组,如下所示:

function foo($parms=array()) {
    $username = parms['username']?:'…';
    $password = parms['password']?:'…';
    $timeout = parms['timeout']?:'…';
}

foo(array('timeout'=>10));

如果输入数组元素不存在,请注意使用?:运算符来允许简单的默认值。

不像光滑,但命名参数还有另一个重要作用:它们允许您使用大量选项而不需要过长的有序参数列表。

编写函数的另一种方法是使用`extract function:

function foo($parms=array()) {
    $username = '…';
    $password = '…';
    $timeout = '…';
    extract($parms,EXTR_IF_EXISTS);
}

此处extract函数将值复制到变量中,但前提是它们已经定义。这可以防止导入您不知道的变量。

答案 4 :(得分:0)

你应该使用其他参数命令

foo($timeout=3,$username='',$password='')

或考虑使用

func_get_args