在PHP中命名参数

在C#中,有一个名为Named Arguments的4.0新function,与Optional Parameters相得益彰。

private static void writeSomething(int a = 1, int b = 2){ // do something here; } static void Main() { writeSomething(b:3); // works pretty well } 

我正在使用此选项从用户获取一些设置值。

在PHP中,除了可选参数之外我找不到任何类似的东西,但我接受做$.fn.extend (jQuery)类函数:

 function settings($options) { $defaults = array("name"=>"something","lastname"=>"else"); $settings = array_merge($defaults,$options); } settigs(array("lastname"=>"John"); 

我想知道你正在使用什么样的解决方案,或者你会用于相同的情况。

正如您所知,PHP中不存在命名参数。

但是一种可能的解决方案是使用一个数组作为唯一参数 – 因为数组项可以命名为:

 my_function(array( 'my_param' => 10, 'other_param' => 'hello, world!', )); 

并且,在您的函数中,您将从该唯一数组参数中读取数据:

 function my_function(array $params) { // test if $params['my_param'] is set ; and use it if it is // test if $params['other_param'] is set ; and use it if it is // test if $params['yet_another_param'] is set ; and use it if it is // ... } 

不过,这个想法有一个主要的不便之处:看看你的函数的定义,人们不知道它期望/他们可以通过什么参数。

他们每次想要调用你的function时都必须阅读文档 – 这不是人们喜欢做的事情,是吗?

附加说明:IDE也无法提供提示; 和phpdoc也将被打破……

您可以通过使用$array= array('arg1'=>'value1');等数组来解决这个问题$array= array('arg1'=>'value1'); 然后让函数接受数组,如function dostuff($stuff); 然后,你可以在函数本身内使用if(isset($stuff['arg1')){//do something.}来检查参数if(isset($stuff['arg1')){//do something.}

这只是一个解决方案,但它可能会有所帮助

你可以通过检查set变量来伪造C ++风格的可选参数(即所有可选参数都在最后):

 function foo($a, $b) { $x = isset($a) ? $a : 3; $y = isset($b) ? $b : 4; print("X = $x, Y = $y\n"); } @foo(8); @foo(); 

它会触发警告,我用@压制。 不是最优雅的解决方案,但在语法上接近你想要的。


编辑。 这是一个愚蠢的想法。 改为使用可变参数:

 // faking foo($x = 3, $y = 3) function foo() { $args = func_get_args(); $x = isset($args[0]) ? $args[0] : 3; $y = isset($args[1]) ? $args[1] : 3; print("X = $x, Y = $y\n"); } foo(12,14); foo(8); foo();