详解php中反射的应用


Posted in PHP onMarch 15, 2016

反射是在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
php反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
      反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。
      通过ReflectionClass,我们可以得到Person类的以下信息:

     1)常量 Contants
     2)属性 Property Names
     3)方法 Method Names静态
     4)属性 Static Properties
     5)命名空间 Namespace
     6)Person类是否为final或者abstract 

然后就去看了看thinkphp的源码,对于MVC的实现也有不同的体验  ThinkPHP\Lib\Core\App.class.php 中的exec方法

if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
    // 非法操作
    throw new ReflectionException();
   }
   //执行当前操作
   $method = new ReflectionMethod($module, $action); #查看方法
   if($method->isPublic()) {
    $class = new ReflectionClass($module); #反射控制器
    // 前置操作
    if($class->hasMethod('_before_'.$action)) {
     $before = $class->getMethod('_before_'.$action);
     if($before->isPublic()) {
      $before->invoke($module);
     }
    }
    // URL参数绑定检测
    if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){
     switch($_SERVER['REQUEST_METHOD']) {
      case 'POST':
       $vars = $_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(isset($vars[$name])) {
       $args[] = $vars[$name];
      }elseif($param->isDefaultValueAvailable()){
       $args[] = $param->getDefaultValue();
      }else{
       throw_exception(L('_PARAM_ERROR_').':'.$name);
      }
     }
     $method->invokeArgs($module,$args);
    }else{
     $method->invoke($module); #执行我们需要调用函数
    }
    // 后置操作
    if($class->hasMethod('_after_'.$action)) {
     $after = $class->getMethod('_after_'.$action);
     if($after->isPublic()) {
      $after->invoke($module);
     }
    }

以上就是关于php中反射的应用,希望对大家理解学习php反射有所帮助。

PHP 相关文章推荐
PHP3 safe_mode 失效漏洞
Oct 09 PHP
php部分常见问题总结
Mar 27 PHP
php 团购折扣计算公式
Nov 24 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
PHP输出日历表代码实例
Mar 27 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
PHP使用DOM对XML解析处理操作示例
Jul 04 PHP
php实现图片上传并进行替换操作
Mar 15 #PHP
php模板引擎技术简单实现
Mar 15 #PHP
9个比较实用的php代码片段
Mar 15 #PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 #PHP
php图片添加文字水印实现代码
Mar 15 #PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 #PHP
Yii rules常用规则示例
Mar 15 #PHP
You might like
使用PHP维护文件系统
2006/10/09 PHP
php之XML转数组函数的详解
2013/06/07 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python3 map函数和filter函数详解
2019/08/26 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
python实现udp传输图片功能
2020/03/20 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
Pycharm中如何关掉python console
2020/10/27 Python
Python中pass的作用与使用教程
2020/11/13 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
普通大学毕业生自荐信
2013/11/04 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
银行竞聘报告范文
2014/11/06 职场文书
党校培训学习心得体会
2016/01/06 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技