PHP可选参数 - 按名称指定参数值?

时间:2010-10-27 01:50:24

标签: php function optional-parameters user-defined-functions

我知道可以使用可选参数,如下所示:

function doSomething($do, $something = "something") {

}

doSomething("do");
doSomething("do", "nothing");

但假设您有以下情况:

function doSomething($do, $something = "something", $or = "or", $nothing = "nothing") {

}

doSomething("do", $or=>"and", $nothing=>"something");

所以在上面一行中它会默认$something为“某事”,即使我为其他一切设置了值。我知道这在.net中是可能的 - 我一直都在使用它。但如果可能的话,我需要在PHP中执行此操作。

有人能告诉我这是否可行?我正在改变我已经整合到Interspire购物车中的Omnistar联盟计划 - 所以我想保持一个功能正常工作,我不改变对该功能的调用的任何地方,但在一个地方(我正在扩展)我想要指定其他参数。我不想创建另一个函数,除非我绝对必须。

4 个答案:

答案 0 :(得分:12)

不,在PHP中,写作时是不可能的。使用数组参数:

function doSomething($arguments = array()) {
    // set defaults
    $arguments = array_merge(array(
        "argument" => "default value", 
    ), $arguments); 

    var_dump($arguments);
}

使用示例:

doSomething(); // with all defaults, or:
doSomething(array("argument" => "other value"));

更改现有方法时:

//function doSomething($bar, $baz) {
function   doSomething($bar, $baz, $arguments = array()) {
    // $bar and $baz remain in place, old code works
}

答案 1 :(得分:3)

答案 2 :(得分:2)

PHP(5.3)目前不提供命名参数。

要解决此问题,您通常会看到一个接收参数array()的函数,然后使用extract()在局部变量中使用提供的参数或array_merge()来默认它们。

您的原始示例如下所示:

$args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something');
doSomething($args);

答案 3 :(得分:0)

PHP没有命名参数。您必须决定一种解决方法。

最常用的是数组参数。但另一个聪明的方法是使用URL参数,如果你只需要文字值:

 function with_options($any) {
      parse_str($any);    // or extract() for array params
 }

 with_options("param=123&and=and&or=or");

将此方法与默认参数结合使用,因为它适合您的特定用例。