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 相关文章推荐
Apache2 httpd.conf 中文版
Nov 17 PHP
How do I change MySQL timezone?
Mar 26 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
php使用memcoder将视频转成mp4格式的方法
Mar 12 PHP
php实现短信发送代码
Jul 05 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 PHP
PHP文件后缀不强制为.php方法
Mar 31 PHP
php简单检测404页面的方法示例
Aug 23 PHP
Laravel模糊查询区分大小写的实例
Sep 29 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
Aug 26 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
Vue常用指令详解分析
2018/08/19 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
python 排列组合之itertools
2013/03/20 Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
财务支持类个人的自我评价
2014/02/14 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
企业业务员岗位职责
2014/03/14 职场文书
合作经营协议书范本
2014/09/16 职场文书
党支部三会一课计划
2014/09/24 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB