我有一个函数,它接受大约10个参数,其中大多数都是可选的。我想知道我是否能够以这样的方式实现它,使得函数的用户不需要打扰参数的顺序。 例如:
public function foo($arg1, $arg2, $arg3='',$arg4='', $arg5='', $arg6='', $arg7=''){}
现在,当我使用此功能时,我可以简单地
$this->foo($arg1val, $arg2val, $arg6val);
有没有办法在PHP中这样做?
以下是我实现此方法的方法: 我已经列出了API中函数接受的参数,因此用户可以使用key =>值对以数组的任何顺序传递参数。
例如:
public function argumentsFilter($origParams, $newParams){
$tmpArr = array();
foreach ($origParams as $origKey){
foreach($newParams as $newKey => $newVal){
if($newKey == $origKey){
$tmpArr[$origKey] = $newVal;
}
}
if(empty($tmpArr[$origKey])){
$tmpArr[$origKey] = '';
}
}
return $tmpArr;
}
public function foo($arg1, $arg2, $arg=array()){
$validArgList = array('arg3', 'arg4', 'arg5', 'arg6', 'arg7');
$correctedArgList = $this->argumentsFilter($validArgList, $arg);
}
有更优雅的方法吗?
答案 0 :(得分:2)
功能的10个参数显然太多了。改为传递数组:
function foo(array $params) {
$defaults = array('foo' => true, 'bar' => false, ...);
$params = array_intersect_key($params, $defaults) + $defaults;
// work with $params['foo']
// maybe extract($params)
}
此示例显示了一个函数,它以任何顺序接受任意数量的“命名参数”,过滤无效值并建立默认值。
答案 1 :(得分:1)
这是不可能的,因为php不支持命名参数。
您有两种选择:使用数组或重新设计您的功能,因此参数较少(后者是首选)。
答案 2 :(得分:0)
有很多方法可以做到这一点,但我推荐这种方法:
function doSomething($required, /*optional*/ $arguments = array()) {
$arguments = array_merge(array(
// set defaults
"argument" => "default value",
), $arguments);
var_dump($arguments);
}
它非常干净且易于理解。