diff --git a/library/think/App.php b/library/think/App.php index 0f3375d9..4f08ee1f 100644 --- a/library/think/App.php +++ b/library/think/App.php @@ -221,11 +221,32 @@ class App $reflect = new \ReflectionMethod($method); } $args = self::bindParams($reflect, $vars); - // 记录执行信息 + self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info'); return $reflect->invokeArgs(isset($class) ? $class : null, $args); } + /** + * 调用反射执行类的实例化 支持依赖注入 + * @access public + * @param string $class 类名 + * @param array $vars 变量 + * @return mixed + */ + public static function invokeClass($class, $vars = []) + { + $reflect = new \ReflectionClass($class); + $constructor = $reflect->getConstructor(); + if ($constructor) { + $args = self::bindParams($constructor, $vars); + } else { + $args[] = Request::instance(); + } + + self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info'); + return $reflect->newInstanceArgs($args); + } + /** * 绑定参数 * @access public diff --git a/library/think/Loader.php b/library/think/Loader.php index 90780d04..ef86720c 100644 --- a/library/think/Loader.php +++ b/library/think/Loader.php @@ -406,7 +406,7 @@ class Loader } $class = self::parseClass($module, $layer, $name, $appendSuffix); if (class_exists($class)) { - return new $class(Request::instance()); + return App::invokeClass($class); } elseif ($empty && class_exists($emptyClass = self::parseClass($module, $layer, $empty, $appendSuffix))) { return new $emptyClass(Request::instance()); }