可能的重复项:
有什么方法可以在 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){
...
}
再见