上記の関数を使用してクラス メソッドを呼び出し、配列を使用してメソッド呼び出しを動的に埋める場合のベスト プラクティスについて考えていました。
どのような利点と欠点がありますか? つまり、特定の条件では、RefelectionMethod + invokeArgs オプションが call_user_funcion よりも最大 40% 速いように見えますが、何か見落としがありますか?
ありがとう。
リクエストに応じて、参照を渡す必要があるシナリオの小さなベンチマークを追加します...これは非常に特殊なケースであり、これは上記の質問と厳密には関係がないことを知っています!
class foo { public function bar(&$a, &$b, &$c) { /* */ } }
$t1 = microtime(true);
$arr = array(1,2,3);
$foo = new foo;
$rfl = new ReflectionMethod('foo', 'bar');
for ($i=0; $i < 10000; ++$i)
{
$rfl->invokeArgs($foo, $arr);
}
$t2 = microtime(true);
echo sprintf("\nElapsed reflectionmethod : %f", $t2 - $t1);
$t1 = microtime(true);
$arr = array(1,2,3);
$foo = new foo;
for ($i=0; $i < 10000; ++$i)
{
foreach( $arr as $k => $v ) $ref[$k] = &$arr[$k];
call_user_func_array( array($foo, 'bar'), $arr);
}
$t2 = microtime(true);
echo sprintf("\nElapsed calluserfuncarray : %f", $t2 - $t1);
結果
Elapsed reflectionmethod : 0.025099
Elapsed calluserfuncarray : 0.051189
どちらを使用するのが良いのか、そしてその理由を知りたいだけです! ただし、速度とは厳密には関係ありません。