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

时间:2012-08-06 17:24:58

标签: 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
}

它运行正常,但是当有多个可选参数时,它很容易变得非常 clutty 。相反,我更愿意做以下事情:

function get_user($user_id = get_id_from_session()) {

   // ... do something with the ID

}

我相信你可以看到这样更方便。 有没有办法实现这一目标,或者有人建议采用另一种更清洁的方法来做到这一点吗?

2 个答案:

答案 0 :(得分:4)

您可以“缩短”这一点的唯一方法是使用ternary operator

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

这只是一个紧凑的写作版本:

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

如果你想要真正的花哨和不太可读,你可以省略中间部分(PHP> 5.3):

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

现在,如果( $user_id)评估为true,则$user_id中的值为$user_id,否则您将从函数中获得返回值。

答案 1 :(得分: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
}