在PHP中以任何顺序允许多个参数

时间:2011-09-07 05:53:07

标签: php arguments

我有一个函数,它接受大约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);   

}

有更优雅的方法吗?

3 个答案:

答案 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);
}

它非常干净且易于理解。