App类的invokeMethod和invokeFunction方法变为public

并且bindParams方法支持按顺序绑定
This commit is contained in:
thinkphp
2016-02-04 12:56:03 +08:00
parent ae1a86f7b2
commit cdbb245b30
2 changed files with 15 additions and 9 deletions

View File

@@ -120,7 +120,7 @@ class App
} }
// 执行函数或者闭包方法 支持参数调用 // 执行函数或者闭包方法 支持参数调用
private static function invokeFunction($function, $vars = []) public static function invokeFunction($function, $vars = [])
{ {
$reflect = new \ReflectionFunction($function); $reflect = new \ReflectionFunction($function);
$args = self::bindParams($reflect, $vars); $args = self::bindParams($reflect, $vars);
@@ -130,7 +130,7 @@ class App
} }
// 调用反射执行类的方法 支持参数绑定 // 调用反射执行类的方法 支持参数绑定
private static function invokeMethod($method, $vars = []) public static function invokeMethod($method, $vars = [])
{ {
if (empty($vars)) { if (empty($vars)) {
// 自动获取请求变量 // 自动获取请求变量
@@ -162,11 +162,16 @@ class App
private static function bindParams($reflect, $vars) private static function bindParams($reflect, $vars)
{ {
$args = []; $args = [];
// 判断数组类型 数字数组时按顺序绑定参数
$keys = array_keys($vars);
$type = array_keys($keys) === $keys ? 1 : 0;
if ($reflect->getNumberOfParameters() > 0) { if ($reflect->getNumberOfParameters() > 0) {
$params = $reflect->getParameters(); $params = $reflect->getParameters();
foreach ($params as $param) { foreach ($params as $param) {
$name = $param->getName(); $name = $param->getName();
if (isset($vars[$name])) { if (1 == $type && !empty($vars)) {
$args[] = array_shift($vars);
} elseif (0 == $type && isset($vars[$name])) {
$args[] = $vars[$name]; $args[] = $vars[$name];
} elseif ($param->isDefaultValueAvailable()) { } elseif ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue(); $args[] = $param->getDefaultValue();

View File

@@ -357,13 +357,14 @@ class Loader
$module = '.' != $info['dirname'] ? $info['dirname'] : CONTROLLER_NAME; $module = '.' != $info['dirname'] ? $info['dirname'] : CONTROLLER_NAME;
$class = self::controller($module, $layer); $class = self::controller($module, $layer);
if ($class) { if ($class) {
if (is_string($vars)) { if (is_scalar($vars)) {
parse_str($vars, $vars); if (strpos($vars, '=')) {
parse_str($vars, $vars);
} else {
$vars = [$vars];
}
} }
$method = new \ReflectionMethod($class, $action . Config::get('action_suffix')); return App::invokeMethod([$class, $action . Config::get('action_suffix')], $vars);
// 记录执行信息
APP_DEBUG && Log::record('[ RUN ] ' . $method->getFileName(), 'info');
return $method->invokeArgs($class, $vars);
} }
} }
/** /**