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

デフォルトの関数の引数は定数値のみを取ることができ、実行時に評価される式は受け取れないため、2番目のオプションは機能しません。

私が持っているアイデアの1つは、このようなものです。

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 に答える