読者です 読者をやめる 読者になる 読者になる

PHPのnewはこれで置き換えだ

PHP

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