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 相关文章推荐
mysql时区问题
Mar 26 PHP
PHP多个版本的分析解释
Jul 21 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
Yii配置文件用法详解
Dec 04 PHP
php中adodbzip类实例
Dec 08 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PHP中的函数声明与使用详解
May 27 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
jQuery 动画基础教程
2008/12/25 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
Python多线程编程(五):死锁的形成
2015/04/05 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
python中的unittest框架实例详解
2021/02/05 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
好的自荐信包括什么内容
2013/11/07 职场文书
实习教师个人的自我评价
2013/11/08 职场文书
法律系毕业生求职信
2014/05/28 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
公司放假通知怎么写
2015/04/15 职场文书
建党伟业的观后感
2015/06/01 职场文书
Windows server 2016服务器基本设置
2022/08/14 Servers