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函数解决SQL injection
Oct 09 PHP
PHP循环获取GET和POST值的代码
Apr 09 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
Look And Say 序列php实现代码
May 22 PHP
php 删除一个数组中的某个值.兼容多维数组!
Feb 18 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
Feb 17 PHP
PDO::prepare讲解
Jan 29 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
PHP队列场景以及实现代码实例详解
Feb 26 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
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Python3遍历目录树实现方法
2015/05/22 Python
Python定时执行之Timer用法示例
2015/05/27 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
python和php哪个更适合写爬虫
2020/06/22 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
化学教师教学反思
2014/01/17 职场文书
机电一体化求职信
2014/03/10 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
写给妈妈的感谢信
2015/01/22 职场文书