详解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 相关文章推荐
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 PHP
使用PHP导出Redis数据到另一个Redis中的代码
Mar 12 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
深入浅析php json 格式控制
Dec 24 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
PHP 布尔值的自增与自减的实现方法
May 03 PHP
PHP getName()函数讲解
Feb 03 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 PHP
PHP针对redis常用操作实例详解
Aug 17 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 PHP
laravel数据库查询结果自动转数组修改实例
Feb 27 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设计模式 Template (模板模式)
2011/06/26 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
php技巧小结【推荐】
2017/01/19 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
PHP7 其他修改
2021/03/09 PHP
javascript 动态添加表格行
2006/06/22 Javascript
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python常见数据结构详解
2014/07/24 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Python骚操作之动态定义函数
2019/03/26 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
大专自我鉴定范文
2013/10/23 职场文书
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
自主招生学校推荐信
2014/09/26 职场文书
民主评议党员总结
2014/10/20 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers