在PHP中命名参数

时间:2011-07-23 12:34:42

标签: c# php asp.net

在C#中,有一个名为Named Arguments的4.0新功能,与可选参数相得益彰。

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");

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

3 个答案:

答案 0 :(得分:2)

正如您所知,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
    // ...

}


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

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

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

答案 1 :(得分:1)

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

这只是一种解决方法,但也许它可以提供帮助

答案 2 :(得分:1)

你可以通过检查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();