thinkPHP基于反射实现钩子的方法分析
本篇章节讲解thinkPHP基于反射实现钩子的方法。分享给大家供大家参考,具体如下: ThinkPHP框架的控制器模块是如何实现 前控制器、后控制器,及如何执行带参数的方法? PHP系统自带的 ReflectionClass、ReflectionMethod 类,可以反射用户自定义类的中属性,方法的权限和参数等信息,通过这些信息可以准确的控制方法的执行。 ReflectionClass: 主要用的方法:
ReflectionMethod: 主要方法:
实例演示 isPublic()) {
$class = new ReflectionClass('BlogAction');
// 执行前置方法
if ($class->hasMethod('_before_detail')) {
$beforeMethod = $class->getMethod('_before_detail');
if ($beforeMethod->isPublic()) {
$beforeMethod->invoke($instance);
}
}
$method->invoke(new BlogAction);
// 执行后置方法
if ($class->hasMethod('_after_detail')) {
$beforeMethod = $class->getMethod('_after_detail');
if ($beforeMethod->isPublic()) {
$beforeMethod->invoke($instance);
}
}
}
// 执行带参数的方法
$method = new ReflectionMethod('BlogAction','test');
$params = $method->getParameters();
foreach ($params as $param) {
$paramName = $param->getName();
if (isset($_REQUEST[$paramName])) {
$args[] = $_REQUEST[$paramName];
} elseif ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue();
}
}
if (count($args) == $method->getNumberOfParameters()) {
$method->invokeArgs($instance,$args);
} else {
echo 'parameters is wrong!';
}
另一段代码参考 isPublic() && !$methodInfo->isStatic()) {
$methodInfo->invoke($controller);
} else { // 操作方法不是public类型,抛出异常
throw new ReflectionException();
}
} catch (ReflectionException $e) {
// 方法调用发生异常后,引导到__call方法处理
$methodInfo = new ReflectionMethod($namespaceClassName,'__call');
$methodInfo->invokeArgs($controller,array($action,''));
}
return;
}
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》。 希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |