2012-04-03 10 views
0

私は非常に単純なWebサービスを作成しており、実装するためにいくつかのフレームワークを気にしたくありません。引数を指定して文字列でメソッドを呼び出す最も良い方法は?

私はそれはので、私は問題は、各メソッドの引数の数が異なるがあるかもしれないです

$myMethod = "test"; 
$args = array("arg1", "arg2"); 
$myMethod(); 

のような文字列を使用して、クラスのメソッドを呼び出すことができます作成​​しようとしています。引数の配列を渡すだけで、$ myMethod()を呼び出し、通常はmyMethod(arg1、arg2)のように引数を渡す方法がありますか?

答えて

2

唯一の方法はcall_user_func_array()ですが、この機能は非常に遅いです。

あなたは、彼らがPHPでeval()を使用していないについてあなたに言ったことを知っていますか? call_user_*の機能は、eval()とちょうど同じだと思います。あなたはこのように盲目的に引数を渡すことができ

ソリューション

1):

$mtd = 'test'; 
$args = array('a','b'); 
array_pad($args, 8, null); 
return $mtd($args[0],$args[1],$args[2],$args[3],$args[4],$args[5],$args[6],$args[7]); 

2)あなたは引数をカウントし、それぞれに異なるハードコードされた関数を呼び出すことができます。

$mtd = 'test'; 
$args = array('a','b'); 

switch(count($args)){ 
    case 0: return $mtd(); 
    case 1: return $mtd($args[0]); 
    case 2: return $mtd($args[0],$args[1]); 
    case 3: return $mtd($args[0],$args[1],$args[2]); 
    case 4: return $mtd($args[0],$args[1],$args[2],$args[3]); 
    case 5: return $mtd($args[0],$args[1],$args[2],$args[3],$args[4]); 
    default: return call_user_func_array($mtd, $args); // slow, but safe 
} 

3)最後に、Drupalがこれを解決するのと同じことをすることができます。 PHPコードを生成してキャッシュします。生成されたコードは特定の数の引数で動作するようにハードコードされていますが、キャッシュをクリアすると、必要に応じて引数の数を増減できます。プラス、それは可能な速い方法です。

+0

ありがとう、私はcall_user_ *のものについて決める必要があるときにこれを考慮に入れます –

1

、ちょうどあなたは、このように関数に関数から可変数の引数を移動することができfunc_get_args()

function mysomething() { 
    $args = func_get_args(); 
    print_r($args); 
} 

を参照してください、あなたはパラメータの可変数を振るう支援します。

+0

同じ関数func_get_args(myFunctionIdentifier);を呼び出して関数名を渡す方法がないので、呼び出すときにその引数リストを知ることができます。あなたはPHPのリフレクションのサポートを持っていることができます –

+0

@ウォルトのPHPのメソッドで壊れるだろうと思います。 'ReflectionFunction'クラスを使用してください。 – Christian