PHPのnewはこれで置き換えだ
PHPの new は、オブジェクト生成後、変数に格納してからでないとそのメソッドが呼べません。ああダサいダサい。
<?php (new MyClass())->myMethod(); //構文エラー $tmp = new MyClass(); $tmp->myMethod(); //こうしないといけない ?>
あと、どこで競合するかわからない__autoloadとか、いつ登録解除したらいいのかわからないSPLのオートロード登録とか…萎えまくりです。
というわけで、すぐにメソッドを呼べて、しかも、もっとカジュアルで環境破壊のない手段をとることにしました。
<?php function newobj($class) { $seppos = strrpos($class, '/'); if($seppos !== FALSE) { require_once substr($class, 0, $seppos); $class = substr($class, $seppos + 1); } $code = '$obj = new ' . $class . '('; for($i = 1; $i < func_num_args(); $i++) { if($i != 0) { $code .= ', '; } $code .= 'func_get_arg(' . $i . ')'; } $code .= ');'; eval($code); return $obj; } //便利なつかいかた newobj('./lib/my_module.php/MyClass', 1, 2, 3)->myMethod(4, 5, 6); //もちろん普通にこれでもいい require_once './lib/my_module.php'; newobj('MyClass', 1, 2, 3)->myMethod(4, 5, 6); ?>
lib/my_module.php に定義した MyClass を、初期化パラメータ 1,2,3 で生成して、myMethod を引数 4,5,6 で呼ぶ。
Javaでいうとこんな感じ。
new lib.mymodule.MyClass(1, 2, 3).myMethod(4, 5, 6);