2011-09-07 49 views
1

我有一個函數需要大約10個參數,其中大多數是可選的。我想知道如果我能夠以這樣的方式實現它,該函數的用戶不需要打擾參數的順序。 例如:允許PHP中的任何順序的多個參數

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

現在,當我使用這個功能,我可以簡單地

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

是否有一個PHP的方式做到這一點?

下面是我如何實現這一點: 我已經列出了函數在API中接受的參數,因此用戶可以按照鍵=>值對的數組中的任何順序傳遞參數。

例如:

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

} 

有沒有更優雅的方式來做到這一點?

+1

您可以嘗試使用[技巧](http://blog.perplexedlabs.com/2009/04/22/php-named-parameters/),但傳遞數組的IMO是最簡單的方法。 如果您希望像其他語言(如:Python,C#)一樣支持命名的[參數](http://en.wikipedia.org/wiki/Named_pa​​rameter),它可能不會很快](https://bugs.php.net/bug.php?id=22216) – NullUserException

回答

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

這個例子表明,接受以任何順序「命名的參數」的任意數量的功能,濾波器無效的值,並建立默認值。

+0

整潔的把戲,謝謝! – abhinav

1

這是不可能的,因爲PHP不支持命名參數。

你有2種選擇:使用數組或重新設計你的函數,使它具有更少的參數(後者是首選)。

0

有很多方法可以做到這一點,但我建議這個方法:

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

    var_dump($arguments); 
} 

這是非常乾淨和易於理解。