35

php是否有可能python具有命名函数参数?一个示例用例是:

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

}

我想覆盖$timeout

foo("", "", 3);

丑陋的。我更愿意这样做:

foo(timeout=3);
4

5 回答 5

34

PHP 8.0 通过接受RFC添加了对命名参数的支持。

命名参数通过在参数名称前面加上冒号作为前缀来传递。允许使用保留关键字作为参数名称。参数名称必须是标识符,不允许动态指定。

例如,在您的示例中仅传递第三个可选参数:

foo(timeout: 3);

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

  • 让您的函数将数组作为参数并检查数组键。我个人觉得这很难看,但它有效且可读。好处是简单,以后很容易添加新参数。缺点是您的功能较少自我记录,并且您不会从 IDE 中获得太多帮助(自动完成、快速功能参数查找等)。
  • 设置不带参数的函数,并使用PHP 5.6+ 中func_get_args()... 可变长度参数功能向 PHP 询问参数。根据参数的数量,您可以决定如何处理每个参数。很多 JQuery 函数都做这样的事情。这很容易,但对于那些调用你的函数的人来说可能会感到困惑,因为它也不是自我记录的。而且您的论点仍未命名。
于 2013-10-01T22:22:21.490 回答
8

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

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

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

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

foo(['timeout'=>10]);

??如果输入数组元素不存在,请注意使用运算符允许简单的默认值。在 PHP 7 之前,您将使用?:which 略有不同,但在这种情况下给出相同的结果。感谢@LeeGee 接受这个。

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

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

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

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

于 2017-04-24T11:49:54.727 回答
6

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

但是,它可能会出现在PHP 8 https://wiki.php.net/rfc/named_pa​​rams

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

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

于 2020-06-20T17:06:15.910 回答
6

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);
于 2020-07-24T08:36:15.227 回答
-3

你应该使用其他参数顺序

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

或考虑使用

func_get_args

于 2013-10-01T22:14:19.580 回答