3

私は、パーサーがどの関数を動的に呼び出すかを決定する PHP で、次のような構造を作成しています。

// The definition of what to call
$function_call_spec = array( "prototype"  => "myFunction", 
                             "parameters" => array( "first_par"  => "Hello",
                                                    "second_par" => "World"));

// Dispatch
$funcPrototype = $function_call_spec["prototype"];
$funcPrototype(); // Here we call function 'myFunction'.

これはすべてうまくてダンディです。しかし、次のステップでは、パラメーターを渡します。これは、私がやりたい方法で可能かどうかはわかりません。驚くことはありませんが、最近のスクリプト言語でできることは次のとおりです。

次のようにパラメータを関数に渡すことができます。

// Here we call function 'myFunction' with the array of parameters.
$funcPrototype( $function_call_spec["parameters"] );

ただし、明確な引数などを使用して「myFunction」を適切に宣言したい:

function myFunction( $first_par, $second_par )
{

}

質問は次のとおりです-パラメーター配列をループするだけで、関数にパラメーターを動的に渡す方法はありますか?

明確にするために、私はこのようにしたくありません:

$funcPrototype( $function_call_spec["parameters"]["first_par"],
                $function_call_spec["parameters"]["second_par"]  );

これには、私のコードが myFunction に関する詳細を静的に知る必要があるため、これは全体のアイデアに反します。

代わりに、おそらく次のような方法でそれをやりたいと思います:

// Special magic PHP function which can be used for invoking functions dynamically
InvokeFunction( $funcPrototype, $function_call_spec["parameters"] );

その結果、 myFunction が呼び出され、配列内のすべてのパラメーターがプロトタイプ内の個々のパラメーター変数に渡されます。

どんなコメントでも大歓迎です。

よろしく。

/R

PS: この投稿のコードは、タイプミスなどについてテストされていません。

4

4 に答える 4

11

call_user_func_array任意の関数またはメソッドを呼び出すことができ、配列からパラメーターを取得できる which を使用する必要があります。

または、 を使用することもできますが、このクラスを他の目的で使用していない限り (呼び出した関数が適切な数と型の引数を受け入れるかどうかを確認するなど) ReflectionFunction::invokeArgs、メリットはありません。call_user_func_array

于 2008-10-11T11:49:10.283 に答える
5
call_user_func_array($funcPrototype, $function_call_spec["parameters"]);

次のように、関数に好みの名前を付けるラッパーを作成することができます。

function InvokeFunction($function, $args = array()) {
    return call_user_func_array($function, (array)$args);
}

この関数を使用すると、3 つの異なる方法で呼び出すことができます。

$return = InvokeFunction('doStuff');
$return = InvokeFunction('doStuff', $single_arg);
$return = InvokeFunction('doStuff', $multiple_args);
于 2008-10-11T11:48:10.723 に答える
0

http://us2.php.net/create_function

create_function()を使用すると、引数は実行時まで評価されません。かなり甘い。

于 2009-01-29T19:00:12.170 に答える
0

call_user_func_array()コントラクトを強制する必要がない場合は が最適です。それ以外の場合は を使用してReflectionFunctionください。

于 2008-10-11T12:53:21.433 に答える