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);
$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)) {
// 自动获取请求变量
@@ -162,11 +162,16 @@ class App
private static function bindParams($reflect, $vars)
{
$args = [];
// 判断数组类型 数字数组时按顺序绑定参数
$keys = array_keys($vars);
$type = array_keys($keys) === $keys ? 1 : 0;
if ($reflect->getNumberOfParameters() > 0) {
$params = $reflect->getParameters();
foreach ($params as $param) {
$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];
} elseif ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue();

View File

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