2011-09-07 3 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_parameter)에 대한 진정한 지원을 원한다면 [곧 ] (https://bugs.php.net/bug.php?id=22216) – NullUserException

답변

2

함수에 대한 매개 변수가 분명히 너무 많습니다. 대신 배열을 전달합니다

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는 명명 된 인수를 지원하지 않으므로 불가능합니다.

배열을 사용하거나 매개 변수 수가 적어 지도록 함수를 다시 디자인 할 수 있습니다 (후자가 선호 됨).

0

그렇게하는 방법에는 여러 가지가 있습니다,하지만 난이 방법을 권장합니다

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

    var_dump($arguments); 
} 

그것은 매우 깨끗하고 이해하기 쉬운입니다.

관련 문제