0

配列を個々の引数に分割して、クラスのコンストラクターに渡そうとしています。call_user_func_array() はどのようにこれを行いますか?

Reflection クラスを使用する方法を見てきましたが、もっと直接的な方法があるかどうか疑問に思っています。

ありがとう

4

2 に答える 2

0

これ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) . ");");
}
于 2012-10-06T18:31:52.373 に答える
0

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);

魔法が減り、より多くのコントロールができるため、よりクリーンです。

于 2012-10-06T18:37:09.347 に答える