PHP 忽略一些默认参数


PHP ignore some default parameters

可能的重复项:
有什么方法可以在 PHP 中指定可选参数值?

只是随机遇到这个。

如果我有这样的函数:

public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){
//do something random
}

调用函数时,是否可以忽略前两个字段并将它们保留为默认值,但指定第三个字段。

例如:

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

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

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

感谢您的阅读

你需要自己做。您可以使用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()) {
    // ...
}

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

根据您的问题,难以捉摸的答案是最好的,但看看圈复杂性:http://en.wikipedia.org/wiki/Cyclomatic_complexity

这是了解您的函数是否做得太多的好方法,这使得您的问题比现在更不成问题。

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

你不能忽略参数。但是你可以做这样的事情:

public function getSomething($limit=null){
return $this->getSomething('x','DESC',$limit);
}

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

再见