public static function InjectionHandler($class, $method = "__construct") { $class = new ReflectionClass($class); // 指定されたメソッドが無い場合、インスタンスを返す。 if (!$class->hasMethod($method)) { return $class->newInstance(); } $params = $class->getMethod($method)->getParameters(); // 引数がある場合は、タイプヒンティングを引数に自身を呼び出し返す。 if (!empty($params)) { $params = array_map(function ($param) { if ($param->getClass() instanceof ReflectionClass) { return Handler::InjectionHandler($param->getClass()->name); } }, $params); // コンストラクタの場合にはインスタンスに引き渡し実行、それ以外の場合にはインスタンス起動後メソッドに引き渡し返す。 if ($method === "__construct") { return $class->newInstanceArgs($params); } else { return call_user_func_array(array($class->newInstance(), $method), $params); } } else { // コンストラクタの場合にはインスタンスを返す。 if ($method === "__construct") { return $class->newInstance(); } else { return call_user_func(array($class->newInstance(), $method)); } } }
/** * @test */ public function handler2() { $blogname = \Apps\Handler::InjectionHandler(\Apps\Controllers\IndexController::class, "getAction"); $this->assertEquals("TestBlog", $blogname); }