2012-01-15 21 views
1

は、私はこれを避けるためにしようとしている:引数が多いときには、何度も特に状況で引数を繰り返している何度も何度も繰り返さずに関数に引数を渡すには?

function do_something($arg1, $arg2, $arg3, $arg4, $arg5) { 

    function do_something_else($arg1, $arg2, $arg3, $arg4, $arg5) { 
     // code  
    } 

    do_something_else($arg1, $arg2, $arg3, $arg4, $arg5); 

    // do other things with the args 

} 

。この例では、メインのdo_something関数の中にdo_something_elseというネストされた関数を持つ必要があります。ネストされた関数は、親に渡されたすべての同じargsを使用します。だから、実際にdo_something関数を実行するときに、それらの引数を渡して、それらの引数をすべてもう一度繰り返す必要があります。

これを処理するクリーナーはありますか?私はPHP関数を組み込みましたfunc_get_args()は、関数内のすべての引数の配列を返しますが、これらを子関数に渡す方法もありますので、基本的にargsを繰り返さずにこれを行う方法を探しています。時間?

+2

すべての引数をクラス/配列に入れることを検討してください。 –

+1

この考えてみましょう:PHPはありません、私の知る限りでは http://stackoverflow.com/questions/1422652/how-to-pass-variable-number-of-arguments-to-a-php-function –

+2

をネストされた関数をサポートしていません。 'do_something'を2回呼び出すと、それは壊れます。 – icktoofay

答えて

2

すでに言いました。簡単にするためにfunc_get_args()を使用できます。 call_user_func_array()とそれを組み合わせると、あなたが行われている:

call_user_func_array("do_something_else", func_get_args()); 

は、実は小さな注意点があります。これはPHP 5.3以降でのみ動作します。その前に、一時変数が必要です。

$args = func_get_args(); 
call_user_func_array("do_something_else", $args); 

実際、それほど簡潔ではありません。しかし、それはすでに別の方法を示しています。代わりに配列から引数を使用するように関数のシグネチャを修正するだけです。

+0

これは、私が5.3.6にあるように1番目を使用することができました。ありがとう! – TK123

3

オブジェクトに引数を入れます。

+0

+1は、オブジェクトの完璧なシナリオのように聞こえます。 –

+0

引数が同じオブジェクト内にあるように関連しているという保証はありません。実際には、それらはすでにオブジェクトであるかもしれません... – Arjan

+0

それらがすべて1つの関数に渡されているという事実は、関係です。オブジェクトにオブジェクトを入れないのはなぜですか? – diggingforfire

-1

あなたは基本的に答えをfunc_get_args()と言います。

function do_something($arg1, $arg2, $arg3, $arg4, $arg5) { 

    function do_something_else($args) { 
     // code  
    } 

    do_something_else(func_get_args()); 

    // do other things with the args 

} 
1
function do_something($arg1, $arg2, $arg3, $arg4, $arg5) { 

    function do_something_else($arg1, $arg2, $arg3, $arg4, $arg5) { 
    echo $arg5; 
    } 

    call_user_func_array('do_something_else', func_get_args()); 
} 

これはのみ、すなわちdo_something_else関数を呼び出すには、1 repetationしかしあなたを救うでしょう。

0

ネストされた関数の場合、 "use"キーワードを使用して、クロージャが周囲のコンテキストから変数を使用できるようにすることもできます。私はこれをかなり頻繁に行います:

$function = function($var) use ($context1, $context2) { 
    // code 
} 
$function($input1); 
$function($input2); 

PHP 5.3以降が必要です。

1

データ転送オブジェクト(DTO)を使用できます。 DTOは、レイヤーまたは関数間でデータを転送するために使用するデータ構造体(構造体またはクラス)です。

0

いつでも関連する配列を渡すことができます。柔軟性を可能にします。

function sample($data = array()) { 
    print_r($data); 
} 

sample(array('id'=>123.'category'=>'tv')); 
関連する問題