【问题标题】:Allowing multiple arguments in any order in PHP在 PHP 中允许以任意顺序使用多个参数
【发布时间】:2011-09-07 05:53:07
【问题描述】:

我有一个函数,它接受大约 10 个参数,其中大多数是可选的。我想知道我是否可以以这样一种方式实现它,即函数的用户不需要为参数的顺序而烦恼。 例如:

public function foo($arg1, $arg2, $arg3='',$arg4='', $arg5='', $arg6='', $arg7=''){}

现在,当我使用这个功能时,我可以简单地

$this->foo($arg1val, $arg2val, $arg6val);

php 中有没有办法做到这一点?

我是这样实现的: 我已经在 API 中列出了函数接受的参数,因此用户可以使用 key=>value 对在数组中以任意顺序传递参数。

例如:

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);   

}

有没有更优雅的方法来做到这一点?

【问题讨论】:

  • tricks 可以尝试,但 IMO 传递数组是最干净的方法。如果你想像其他一些语言(例如:Python、C#)那样真正支持命名parameters,它可能不会出现any time soon

标签: php arguments


【解决方案1】:

一个函数的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)
}

这个例子展示了一个函数,它以任意顺序接受任意数量的“命名参数”,过滤无效值并建立默认值。

【讨论】:

    【解决方案2】:

    这是不可能的,因为 php 不支持命名参数。

    您有 2 个选择:使用数组或重新设计函数以减少参数(首选后者)。

    【讨论】:

      【解决方案3】:

      有很多方法可以做到这一点,但我推荐这种方法:

      function doSomething($required, /*optional*/ $arguments = array()) {
          $arguments = array_merge(array(
              // set defaults
              "argument" => "default value", 
          ), $arguments); 
      
          var_dump($arguments);
      }
      

      它非常简洁易懂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 2016-02-06
        • 2014-08-20
        • 1970-01-01
        • 2018-05-04
        相关资源
        最近更新 更多