From 21838296a294e90600d5e72edbf0a2659c280fb4 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Wed, 13 Jan 2016 18:13:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9BApp=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E6=9C=BA=E5=88=B6=20callable=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E9=92=88=E5=AF=B9=E6=96=B9=E6=B3=95=20closure=20?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=92=88=E5=AF=B9=E5=87=BD=E6=95=B0=E5=92=8C?= =?UTF-8?q?=E9=97=AD=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/App.php | 117 ++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 68 deletions(-) diff --git a/library/think/App.php b/library/think/App.php index ee2ea27d..53c5ca15 100644 --- a/library/think/App.php +++ b/library/think/App.php @@ -99,18 +99,11 @@ class App break; case 'callable': // 执行回调方法 - $callable = self::$dispatch['callable']; - if (is_callable($callable)) { - $data = is_array($callable) ? - self::reflectionInvoke(new $callable[0], $callable[1]) : // 数组定义需要实例化的对象和方法 - call_user_func_array($callable, self::$dispatch['params']); // 静态方法或者函数 - } else { - throw new Exception('not callable : ' . (is_array($callable) ? implode('->', $callable) : $callable), 10009); - } + $data = self::invokeMethod(self::$dispatch['callable'], self::$dispatch['params']); break; case 'closure': // 规则闭包 - $data = self::invoke(self::$dispatch['closure'], self::$dispatch['params']); + $data = self::invokeFunction(self::$dispatch['closure'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); @@ -121,44 +114,61 @@ class App return Response::send($data, Response::type(), Config::get('response_return')); } - // 执行规则匹配下的闭包方法 支持参数调用 - private static function invoke($closure, $var = []) + // 执行函数或者闭包方法 支持参数调用 + private static function invokeFunction($closure, $vars = []) { $reflect = new \ReflectionFunction($closure); - $params = $reflect->getParameters(); - $args = []; - foreach ($params as $param) { - $name = $param->getName(); - if (isset($var[$name])) { - $args[] = $var[$name]; - } elseif ($param->isDefaultValueAvailable()) { - $args[] = $param->getDefaultValue(); - } - } + $args = self::bindParams($reflect, $vars); return $reflect->invokeArgs($args); } // 调用反射执行类的方法 支持参数绑定 - private static function reflectionInvoke($class, $method) + private static function invokeMethod($method, $vars = []) { - //执行当前操作 - $reflect = new \ReflectionMethod($class, $method); - if ($reflect->isPublic()) { - // URL参数绑定检测 - if (Config::get('url_params_bind') && $reflect->getNumberOfParameters() > 0) { - // 获取绑定参数 - $args = self::getBindParams($reflect, Config::get('url_parmas_bind_type')); - // 全局过滤 - array_walk_recursive($args, 'think\\Input::filterExp'); - $data = $reflect->invokeArgs($class, $args); - } else { - $data = $reflect->invoke($class); + if (empty($vars)) { + // 自动获取请求变量 + switch ($_SERVER['REQUEST_METHOD']) { + case 'POST': + $vars = array_merge($_GET, $_POST); + break; + case 'PUT': + parse_str(file_get_contents('php://input'), $vars); + break; + default: + $vars = $_GET; } - } else { - // 操作方法不是Public 抛出异常 - throw new \ReflectionException(); } - return $data; + if (is_array($method)) { + $class = is_object($method[0]) ? $method[0] : new $method[0]; + $reflect = new \ReflectionMethod($class, $method[1]); + } else { + // 静态方法 + $reflect = new \ReflectionMethod($method); + } + $args = self::bindParams($reflect, $vars); + return $reflect->invokeArgs(isset($class) ? $class : null, $args); + } + + // 绑定参数 + private static function bindParams($reflect, $vars) + { + $args = []; + if ($reflect->getNumberOfParameters() > 0) { + $params = $reflect->getParameters(); + foreach ($params as $param) { + $name = $param->getName(); + if (isset($vars[$name])) { + $args[] = $vars[$name]; + } elseif ($param->isDefaultValueAvailable()) { + $args[] = $param->getDefaultValue(); + } else { + throw new Exception('method param miss:' . $name, 10004); + } + } + // 全局过滤 + array_walk_recursive($args, 'think\\Input::filterExp'); + } + return $args; } // 执行 模块/控制器/操作 @@ -235,7 +245,7 @@ class App throw new \ReflectionException(); } // 执行操作方法 - $data = self::reflectionInvoke($instance, $action); + $data = self::invokeMethod($call); } catch (\ReflectionException $e) { // 操作不存在 if (method_exists($instance, '_empty')) { @@ -269,35 +279,6 @@ class App return $class; } - // 获取操作方法的参数绑定 - private static function getBindParams($method, $paramsBindType) - { - switch ($_SERVER['REQUEST_METHOD']) { - case 'POST': - $vars = array_merge($_GET, $_POST); - break; - case 'PUT': - parse_str(file_get_contents('php://input'), $vars); - break; - default: - $vars = $_GET; - } - $params = $method->getParameters(); - foreach ($params as $param) { - $name = $param->getName(); - if (1 == $paramsBindType && !empty($vars)) { - $args[] = array_shift($vars); - } elseif (0 == $paramsBindType && isset($vars[$name])) { - $args[] = $vars[$name]; - } elseif ($param->isDefaultValueAvailable()) { - $args[] = $param->getDefaultValue(); - } else { - throw new Exception('url param bind error:' . $name, 10004); - } - } - return $args; - } - // 初始化模块 private static function initModule($module, $config) {