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 相关文章推荐
图书管理程序(一)
Oct 09 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
Jun 26 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
PHP如何将XML转成数组
Apr 04 PHP
ZendFramework2连接数据库操作实例
Apr 18 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
php日志函数error_log用法实例分析
Sep 23 PHP
Laravel 自带的Auth验证登录方法
Sep 30 PHP
PHPExcel实现的读取多工作表操作示例
Apr 14 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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中array_merge与array+array的区别
2013/06/21 PHP
详解json在php中的应用
2018/09/30 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
委托证明的格式
2014/01/10 职场文书
实用的简历自我评价
2014/03/06 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
党员承诺书范文
2014/05/19 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
财产保全担保书
2015/01/20 职场文书
司机岗位职责
2015/02/04 职场文书