随便偶然发现了这一点。
如果我有这样的功能:
public function getSomething($orderBy='x', $direction = 'DESC', $limit=null){
//do something random
}
调用函数时,可以忽略前两个字段并保留默认值但指定第3个字段。
例如:
$random = $this->my_model->getSomething(USE_DEFAULT, USE_DEFAULT, 10);
我知道我可以传递第一个和第二个参数,但所有我要问的是它们是否是某种特殊关键字,只是说使用默认值。
希望这是有道理的。这不是问题,只是好奇。
感谢阅读
答案 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