php反射类ReflectionClass用法分析


Posted in PHP onMay 12, 2016

本文实例讲述了php反射类ReflectionClass用法。分享给大家供大家参考,具体如下:

先来看一段代码:

/**
 * @name PHP反射API--利用反射技术实现的插件系统架构
 * @author :PHPCQ.COM
 */
interface Iplugin
{
 public static
 function getName();
}
function findPlugins()
{
 $plugins = array();
 foreach(get_declared_classes() as $class)
 {
  $reflectionClass = new ReflectionClass($class);
  if ($reflectionClass - > implementsInterface('Iplugin'))
  {
   $plugins[] = $reflectionClass;
  }
 }
 return $plugins;
}
function computeMenu()
{
 $menu = array();
 foreach(findPlugins() as $plugin)
 {
  if ($plugin - > hasMethod('getMenuItems'))
  {
   $reflectionMethod = $plugin - > getMethod('getMenuItems');
   if ($reflectionMethod - > isStatic())
   {
    $items = $reflectionMethod - > invoke(null);
   }
   else
   {
    $pluginInstance = $plugin - > newInstance();
    $items = $reflectionMethod - > invoke($pluginInstance);
   }
   $menu = array_merge($menu, $items);
  }
 }
 return $menu;
}
function computeArticles()
{
 $articles = array();
 foreach(findPlugins() as $plugin)
 {
  if ($plugin - > hasMethod('getArticles'))
  {
   $reflectionMethod = $plugin - > getMethod('getArticles');
   if ($reflectionMethod - > isStatic())
   {
    $items = $reflectionMethod - > invoke(null);
   }
   else
   {
    $pluginInstance = $plugin - > newInstance();
    $items = $reflectionMethod - > invoke($pluginInstance);
   }
   $articles = array_merge($articles, $items);
  }
 }
 return $articles;
}
require_once('plugin.php');
$menu = computeMenu();
$articles = computeArticles();
print_r($menu);
print_r($articles);

plugin.php 代码如下:

<?php
class MycoolPugin implements Iplugin
{
 public static
 function getName()
 {
  return 'MycoolPlugin';
 }
 public static
 function getMenuItems()
 {
  return array(array('description' => 'MycoolPlugin', 'link' => '/MyCoolPlugin'));
 }
 public static
 function getArticles()
 {
  return array(array('path' => '/MycoolPlugin', 'title' => 'This is a really cool article', 'text' => xxxxxxxxx));
 }
}

上述代码是php反射类的一个应用。

什么是php反射类,顾名思义,可以理解为一个类的映射。

举个例子:

class fuc { //定义一个类
 static
 function ec() {
  echo '我是一个类';
 }
}
$class=new ReflectionClass('fuc'); //建立 fuc这个类的反射类

至于$class 这反射类里有什么东东,可以查看手册,这里不详解了

$fuc=$class->newInstance(); //相当于实例化 fuc 类
$fuc->ec(); //执行 fuc 里的方法ec
/*最后输出:我是一个类*/

其中还有一些更高级的用法

$ec=$class->getmethod('ec'); //获取fuc 类中的ec方法
$fuc=$class->newInstance(); //实例化
$ec->invoke($fuc);   //执行ec 方法

上面的过程很熟悉吧。其实和调用对象的方法类似

只不过这里是反着来的,方法在前,对象在后

PHP 相关文章推荐
php访问查询mysql数据的三种方法
Oct 09 PHP
PHP define函数的使用说明
Aug 27 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
如何使用php实现评委评分器
Jul 31 PHP
yii实现使用CUploadedFile上传文件的方法
Dec 28 PHP
PHP简单获取及判断提交来源的方法
Apr 22 PHP
PHP邮箱验证示例教程
Jun 01 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 PHP
PHP 的比较运算与逻辑运算详解
May 12 #PHP
php使用文本统计访问量的方法
May 12 #PHP
php格式化json函数示例代码
May 12 #PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 #PHP
yii2带搜索功能的下拉框实例详解
May 12 #PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 #PHP
PHP数据库操作Helper类完整实例
May 11 #PHP
You might like
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
Vue中插入HTML代码的方法
2018/09/21 Javascript
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
python如何将图片转换素描画
2020/09/08 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
Java如何格式化日期
2012/08/07 面试题
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
财务工作个人求职的自我评价
2013/12/19 职场文书
餐饮业的创业计划书范文
2013/12/26 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
python语言中pandas字符串分割str.split()函数
2022/08/05 Python