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
}

它工作得很好,但是当有多个可选参数时它很容易变得非常混乱。相反,我更愿意执行以下操作:

function get_user($user_id = get_id_from_session()) {

   // ... do something with the ID

}

我相信您会看到这样更方便。有什么办法可以做到这一点,或者有人对另一种更清洁的方法有建议吗?

4

2 回答 2

4

您可以“缩短”它的唯一方法是使用三元运算符

$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 in的值$user_id,否则您将获得函数的返回值。

于 2012-08-06T17:29:36.517 回答
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
}
于 2012-08-06T17:32:58.947 回答