配列を個々の引数に分割して、クラスのコンストラクターに渡そうとしています。call_user_func_array() はどのようにこれを行いますか?
Reflection クラスを使用する方法を見てきましたが、もっと直接的な方法があるかどうか疑問に思っています。
ありがとう
配列を個々の引数に分割して、クラスのコンストラクターに渡そうとしています。call_user_func_array() はどのようにこれを行いますか?
Reflection クラスを使用する方法を見てきましたが、もっと直接的な方法があるかどうか疑問に思っています。
ありがとう
これReflectionClass
を行うための最良の方法であり、これを行うための最も直接的な方法ですが、別の方法があります。
function call_new_array($klass, $args)
{
$vars = array();
$loads = array();
foreach($args as $i => $x) {
$vars[] = '$v' . $i;
$loads[] = '$v' . $i . ' = $args[' . $i . ']';
}
return eval(implode(";",$loads) .
";return new $klass(" . implode(",", $vars) . ");");
}
call_user_func_array()、(名前が示すように) 関数/メソッドを呼び出しますが、オブジェクトを作成することを意図していないため、ReflectionClass を使用します。
$refClass = new ReflectionClass($class);
$object = $refClass->newInstanceArgs($args);
もう1つの(より設計ベースの)ソリューションは、静的ファクトリメソッドです
class Demo () {
public static function set_args ($args) {
return new self($args[0],$args[1],$args[2]);
}
}
そしてちょうど
$object = $class::set_args($args);
魔法が減り、より多くのコントロールができるため、よりクリーンです。