2013-10-01 38 views
5

php是否可能在python中命名函数参数?一个例子的使用情况是:在PHP中命名的函数参数

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

} 

我要重写$timeout

foo("", "", 3); 

难看。我宁愿做:

foo(timeout=3); 
+0

答案是否定的,但我相信目前正在讨论关于该主题的[RFC](https://wiki.php.net/rfc/named_pa​​rams),但它不太可能超出讨论阶段...... 。我相信Facebook的[hh](https://t.co/I0RUiMMEsb)实现它,虽然我做了 –

+0

,不起作用。 – Justin

+0

对不起,我误解你在问什么。 –

回答

4

号,命名参数在PHP中是不可能的。从技术角度而言,当您致电foo($timeout=3)时,它首先评估$timeout=3,结果为3并将其作为第一个参数传递给foo()。 PHP强制执行参数顺序,因此可比较的调用将需要为foo("", "", $timeout=3)。您有两个其他选项:

  • 让您的函数将数组作为参数并检查数组键。我个人发现这个丑陋的,但它的工作原理和可读性。上行是简单的,并且以后可以很容易地添加新的参数。缺点是你的功能较少自我记录,你不会从IDE获得很多帮助(自动完成,快速功能参数查找等)。
  • 设置没有参数的函数并向PHP请求使用func_get_args()的参数或在PHP 5.6+中使用...variable length arguments feature。根据参数的数量,您可以决定如何处理每个参数。很多JQuery函数都是这样做的。这很容易,但对于那些调用你的函数的人来说可能会造成混淆,因为它也不是自我记录。而你的论点仍然没有命名。

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

+0

华丽从美学pov的分配技术。只有一个缺点,它看起来很像命名参数(ahem,这是没有的?)。但是,这可能给人的印象是订单无关紧要,事实上它的确如此。我想这部分不是那么自我记录。所以要纠正你的答案,你只能这样做:'foo('','',$ timeout = 3);' – nus

+0

ps:还有其他一些小缺点:性能(很少会成为问题),并可能覆盖现有的变量。所有优势超过'foo('','',3/* timeout * /);'是有问题的。 – nus

0

你应该使用其他参数订购

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

或考虑使用

func_get_args

+0

我认为这是他询问的一个普遍问题,而不是在这个特定情况下。 – Fluffeh

+0

超时虽然不属于第一,但是很奇怪的行为,标准是用户名,密码。 – Justin

+0

所以如果你想要你原来的顺序 - 比你不得不使用func_get_args - 数它们,然后将它们设置为你需要的变量,在其他情况下 - PHP如何知道你正在传递的超时 - isn'用户名? – Axel

0

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

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

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

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

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

注意使用?:运营商的,允许一个简单的默认如果输入数组元素没有按”不存在。

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

写入功能的另一种方法是使用`提取功能:

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

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