Php 函数参数:函数的默认值返回?

Php 函数参数:函数的默认值返回?,php,function,arguments,optional-arguments,Php,Function,Arguments,Optional Arguments,我有许多带有可选参数的函数,这些函数在省略的值上从指定的函数获取其默认值,目前我的代码如下所示: 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 } function

我有许多带有可选参数的函数,这些函数在省略的值上从指定的函数获取其默认值,目前我的代码如下所示:

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
}
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;
}
它工作得很好,但是当有多个可选参数时,它很容易变得非常clutty。相反,我更愿意做如下事情:

function get_user($user_id = get_id_from_session()) {

   // ... do something with the ID

}
我相信你会发现这样更方便有没有办法做到这一点,或者有没有人对另一种更干净的方法有什么建议?

唯一可以“缩短”的方法是使用:

这只是一个简洁的写作版本:

if( $user_id === false) {
    $user_id = get_id_from_session();
}
如果您想变得更花哨、可读性更低,可以省略中间部分(PHP>5.3):


现在,如果
($user\u id)
的计算结果为true,您将在
$user\u id
中获得
$user\u id
的值,否则您将从函数中获得返回值。

默认函数参数只能采用常量值,而不是在运行时计算的表达式,因此第二个选项将不起作用

我有一个想法是这样的

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\u defaults()
函数可能如下所示:

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
}
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\u 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
}

它确实缩短了代码,但在我看来,可读性变得越来越差。@Zar:任何其他达到相同效果的技巧也会破坏可读性。