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里的JS打印函数
Oct 09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
PHP+ACCESS 文章管理程序代码
Jun 21 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
php实现文件编码批量转换
Mar 10 PHP
ThinkPHP3.2.2的插件控制器功能简述
Jul 09 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
php计算两个文件相对路径的方法
Mar 14 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
php数值转换时间及时间转换数值用法示例
May 18 PHP
php中文乱码问题的终极解决方案汇总
Aug 01 PHP
php+laravel 扫码二维码签到功能
May 15 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
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
JS window.opener返回父页面的应用
2009/10/24 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
页面使用密码保护代码
2013/04/10 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
Python多层装饰器用法实例分析
2018/02/09 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
python3去掉string中的标点符号方法
2019/01/22 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
厂长助理岗位职责
2013/12/27 职场文书
消防器材管理制度
2014/01/28 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
高中化学教学反思
2016/02/22 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js