コンストラクタ引数を柔軟にしたい
普通の関数やメソッドの場合は call_user_func_array() を使えばいい。しかしオブジェクト生成の場合はどうするか。
$obj = call_user_func_array(array('ClassName', '__construct'), $args);
これは無理。コンストラクタはstaticじゃないし。
内部的に、newでのコンストラクタ呼び出しは関数呼び出しと全く別物ぽい。
他の人はどうやってるんだろう・・・と思って http://www.hawklab.jp/scarlet/ を見てみると
$len = count($args); switch($len) { case 0: $obj = & new $className(); break; case 1; $obj = & new $className($args[0]); break; ・・・ default: eval("\$obj = new $className".ごにょごにょ); }
のようにやっていた。
なるほど・・。
やっぱり並べるのかーというのとeval()を使って引数が多い場合にも対応しているので二度納得した。
完成度が高そうなのでこれをそのまま使いたいところだけれど・・やっぱり設定ファイルレスがいいしReflectionを使ってみたいので作ることにする。