是否可以在 PHP 中使用命名函数参数?

2022-08-30 12:56:43

有没有可能在 like in 有命名的函数参数?一个示例用例是:phppython

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

}

我想覆盖 :$timeout

foo("", "", 3);

丑。我宁愿这样做:

foo(timeout=3);

答案 1

PHP 8.0 在接受 RFC 的情况下增加了对命名参数的支持

命名参数的传递方法是在值前面加上参数名称,后跟冒号。允许使用保留关键字作为参数名称。参数名称必须是标识符,不允许动态指定。

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

foo(timeout: 3);

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

  • 让函数将数组作为参数并检查数组键。我个人觉得这很丑陋,但它有效且可读。好处是简单,以后很容易添加新参数。缺点是您的函数的自我记录较少,并且您不会从IDE获得太多帮助(自动完成,快速函数参数查找等)。
  • 设置不带参数的函数,并使用func_get_args() 请求 PHP 提供参数,或使用 PHP 5.6+ 中的可变长度参数功能。根据参数的数量,您可以决定如何处理每个参数。很多JQuery函数都做这样的事情。这很容易,但对于那些调用函数的人来说可能会令人困惑,因为它也不是自我记录的。你的论点仍然没有被命名。...

答案 2

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

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

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

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

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

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

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

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

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

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


推荐