2012-08-06 6 views
2

내가 생략 된 값에 지정된 함수에서 기본 값을 가져옵니다 선택적 인수와 기능의 많이 가지고, 현재 내 코드는 다음과 같이 보입니다 : 그것은 잘 작동함수 인수 : 함수의 기본값 반환?

function get_user($user_id = FALSE) { 

    // If no ID is passed, get from session 
    if(!$user_id) { 
     $user_id = get_id_from_session();  
    } 

    // ... do something with the ID 
} 

을하지만 쉽게 얻는다 매우 clutty 더 많은 선택적 인수가있을 때. 대신 다음과 같은 것을 선호합니다.

function get_user($user_id = get_id_from_session()) { 

    // ... do something with the ID 

} 

내가 더 편리하다는 것을 알 수있을 것입니다. 이를 수행 할 방법이 없습니까? 아니면 다른 사람이이 작업을 수행하는 다른 방법을 제안 했습니까? 당신이 "단축"할 수

답변

4

유일한 방법이 사용하는 것입니다 ternary operator : 당신이 진짜하고 싶다면

if($user_id === false) { 
    $user_id = get_id_from_session(); 
} 

: 쓰기의 단지 소형 버전입니다

$user_id = ($user_id === false) ? get_id_from_session() : $user_id; 

(PHP> 5.3)

$user_id = ($user_id) ?: get_id_from_session(); 
중간 부분을 생략 할 수 있습니다.이제 ($user_id)이 true로 평가되면 $user_id의 값이 $user_id에 표시됩니다. 그렇지 않으면 함수의 반환 값을 얻게됩니다.

+0

주 :'? :'약 속은 PHP 5.3+에서만 작동합니다. –

+0

확실히 코드가 짧아 지지만 가독성은 내 의견으로는 훨씬 나빠질 수 있습니다. – Zar

+0

@Rocket 좋은 지적으로, 나는 그것을 내 대답에 추가했습니다. – nickb

3

기본 함수 인수는 런타임에 계산되는식이 아닌 상수 값만 사용할 수 있으므로 두 번째 옵션은 작동하지 않습니다.

내가 갖고있는 아이디어 하나는 이와 같을 것입니다.

function foo($user_id = null) { 
    $data = get_defaults('user_id' => $user_id); 

    extract($data); 

    echo $user_id; // should be the value returned from get_defaults() 
} 

get_defaults() 기능은 다음과 같습니다

function get_defaults(array $params) { 
    if (isset($params['user_id']) && is_null($params['user_id'])) { 
     $params['user_id'] = get_id_from_session(); 
    } 

    if (isset($params['something_else']) && !isValidSomething($params['something_else'])) { 
     $params['something_else'] = get_something_else(); 
    } 

    return $params; 
} 

당신은 특정 호출 된 함수가 기대하는 인수에 따라 get_defaults() 함수에 배열을 전달하는 것입니다. 따라서 또 다른 예는 다음과 같습니다 :

function bar($baz, $user_id = null, $user_name = null, $return = null) { 
    $data = get_defaults(array('return' => $return, 
           'user_name' => $user_name, 
           'user_id' => $user_id)); 

    extract($data); 

    // normal function code below 
}