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

可以在PHP中使用命名函数参数吗?,php,named-parameters,php-8,Php,Named Parameters,Php 8,在php中是否可以像在python中一样使用命名函数参数?一个示例用例是: function foo($username = "", $password = "", $timeout = 10) { } 我想覆盖$timeout: foo("", "", 3); 丑陋的。我宁愿做: foo(timeout=3); 您应该使用其他参数来排序 foo($timeout=3,$username='',$passwo

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

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

}
我想覆盖
$timeout

foo("", "", 3);
丑陋的。我宁愿做:

foo(timeout=3);

您应该使用其他参数来排序

foo($timeout=3,$username='',$password='')
或者考虑使用


PHP8.0添加了对命名参数的支持,并接受了

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

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

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

  • 让函数将数组作为参数并检查数组键。我个人觉得这很难看,但它是有效的,可读性强。优点是简单,以后添加新参数也很容易。缺点是,您的函数较少进行自我记录,并且您不会从IDE(自动完成、快速函数参数查找等)获得太多帮助
  • 设置不带参数的函数,并使用PHP 5.6+中的
    向PHP询问参数。根据参数的数量,您可以决定如何处理每个参数。很多JQuery函数都是这样做的。这很容易,但对于调用函数的人来说可能会混淆,因为它也不是自文档。你的论点还没有命名

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

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

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

      function foo($parms=[]) {
          $username = $parms['username'] ?? '…';
          $password = $parms['password'] ?? '…';
          $timeout  = $parms['timeout'] ?? '…';
      }
      
      foo(['timeout'=>10]);
      
      请注意,如果输入数组元素不存在,则使用
      运算符允许使用简单的默认值。在PHP7之前,您将使用
      ?:
      ,这与PHP 7略有不同,但在本例中给出相同的结果。感谢@LeeGee帮我接这个电话

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

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

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

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

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

但是,它可能会发展到
PHP8

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


更新:RFC已批准命名参数将在PHP8中实现

2020年更新答案:PHP8将支持命名参数,RFC已通过

这是什么意思? 本机函数和当前代码都可以使用命名参数

它是如何工作的? 假设您定义了一个函数:

函数foo($a=10,$b=20,$c=30){ 返回$a*$b-$c; } 您现在可以这样调用此函数:

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

我认为这是他问的一个一般性问题,而不是在这个特殊情况下。超时不属于第一个,只是非常奇怪的行为,标准是用户名、密码。因此,如果你想输入原始顺序,你必须使用func_get_args对它们进行计数,然后将它们设置为你需要的变量,在其他情况下,php如何知道您正在传递的超时不是用户名?python如何做到:
foo(timeout=3)
。好的,我想我必须使用dirty
func\u get\u args()
。类似的功能可能适合您。然而,这并不是一个很大的视觉改善。。。我分享了一个Q/a作为一个解决方案,这将是可能的。它是从PHP8:Hurray开始提供的,用于美学角度的分配技术。有一个缺点,它看起来很像命名的参数(啊,这是重点吗?)。但这可能会给人留下这样的印象:秩序不再重要了,事实上它确实如此。我想这部分内容不是那么自我记录的。因此,要更正您的答案,从技术上讲,您只能执行:
foo(“”,,$timeout=3)附言:还有其他一些小缺点:性能(很少会成为问题)和可能覆盖现有变量。总之,相对于
foo(“”,,,3/*timeout*/)的优势有问题。您可能应该为PHP8更新此代码。支持命名参数。@JacobThomason已更新,谢谢。我会在PHP8发布后再次更新。对我来说不起作用。谢谢公共函数getPaginatedRecords($queryObject='',$currentPage=1,$limit=10){}//$this->getPaginatedRecords(查询对象:$user\u数据,当前页面:1,限制:10);