【问题标题】:PHP function - ignore some default parameters [duplicate]PHP函数-忽略一些默认参数[重复]
【发布时间】:2012-03-02 23:22:17
【问题描述】:

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

只是偶然发现的。

如果我有这样的功能:

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

//do something random

}

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

例如:

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

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

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

感谢阅读

【问题讨论】:

标签: php function parameters


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

这是了解您的函数是否执行过多操作的好方法,这使您的问题不像现在那样成为问题。

【讨论】:

  • 没错。每个人都应该牢记复杂性。 +1!
  • 谢谢。会读进去:)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    再见

    【讨论】:

    • 不,他不能。 PHP 不支持重载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多