PHP函数 - 忽略一些默认参数

时间:2012-03-02 23:22:17

标签: php function parameters

  

可能重复:
  Any way to specify optional parameter values in PHP?

随便偶然发现了这一点。

如果我有这样的功能:

public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){

//do something random

}

调用函数时,可以忽略前两个字段并保留默认值但指定第3个字段。

例如:

$random = $this->my_model->getSomething(USE_DEFAULT, USE_DEFAULT, 10);

我知道我可以传递第一个和第二个参数,但所有我要问的是它们是否是某种特殊关键字,只是说使用默认值。

希望这是有道理的。这不是问题,只是好奇。

感谢阅读

4 个答案:

答案 0 :(得分:12)

你需要自己做。您可以使用null表示应使用默认值:

public function getSomething($orderBy = null, $direction = null, $limit = null) {
    // fallbacks
    if ($orderBy === null) $orderBy = 'x';
    if ($direction === null) $direction = 'DESC';

    // do something random
}

然后在调用它时传递null以表示您要使用默认值:

$random = $this->my_model->getSomething(null, null, 10);

我有时使用的另一种可能的解决方案是参数列表最后的附加参数,包含所有可选参数:

public function foo($options = array()) {
    // merge with defaults
    $options = array_merge(array(
        'orderBy'   => 'x',
        'direction' => 'DESC',
        'limit'     => null
    ), $options);

    // do stuff
}

这样您就不需要指定所有可选参数。 array_merge()确保您始终处理一整套选项。你可以这样使用它:

$random = $this->my_model->foo(array('limit' => 10));

似乎这个特殊情况没有必需的参数,但是如果你需要参数,只需将它添加到可选的参数前面:

public function foo($someRequiredParameter, $someOtherRequiredParameter, $options = array()) {
    // ...
}

答案 1 :(得分:1)

老实说,当功能试图做太多时,这就成了一个问题。当你看到一个函数增长到多个参数时,几乎总会有一个更好的设计模式(通常是继承旧代码的穷人,附加参数是“完成工作”的最快方式)。

根据您的问题,Elusive的答案是最好的,但请看一下圈复杂度: http://en.wikipedia.org/wiki/Cyclomatic_complexity

这是了解你的功能是否做得太多的好方法,这使得你的问题不再是现在的问题。

答案 2 :(得分:0)

我不认为PHP可以做到这一点。我所知道的最佳解决方案如下: http://www.php.net/manual/en/functions.arguments.php#70511

答案 3 :(得分:-2)

你不能忽视params。但你可以这样做:

public function getSomething($limit=null){

return $this->getSomething('x','DESC',$limit);

}


public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){

...

}

见ya