ログ日記

作業ログと日記とメモ

コンストラクタ引数を柔軟にしたい

普通の関数やメソッドの場合は 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を使ってみたいので作ることにする。