【问题标题】:Function argument: default value return of a function?函数参数:函数的默认值返回?
【发布时间】:2012-08-03 16:52:08
【问题描述】:

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

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

}

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

【问题讨论】:

    标签: php function arguments optional-arguments


    【解决方案1】:

    您可以“缩短”它的唯一方法是使用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) 的计算结果为真,您将在$user_id 中获得$user_id 的值,否则您将获得函数的返回值。

    【讨论】:

    • 它确实缩短了代码,但在我看来,可读性变得非常非常糟糕......
    • @Zar:任何其他达到相同效果的技巧也会破坏可读性。
    【解决方案2】:

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

    我的一个想法是这样的。

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 2020-06-24
      • 2019-02-22
      • 1970-01-01
      • 2011-02-20
      • 2011-04-09
      • 1970-01-01
      • 2019-09-11
      • 2015-07-08
      相关资源
      最近更新 更多