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 header()函数使用说明
Jul 10 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
解析php5配置使用pdo
Jul 03 PHP
php中用socket模拟http中post或者get提交数据的示例代码
Aug 08 PHP
php使用curl存储cookie的示例
Mar 31 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
PHP模块化安装教程
Jun 01 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
PHP工厂模式的日常使用
Mar 20 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
JS二分查找算法详解
2017/11/01 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
python组合无重复三位数的实例
2018/11/13 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
护理学应聘自荐书范文
2014/02/05 职场文书
高中毕业生的个人自我评价
2014/02/21 职场文书
酒鬼酒广告词
2014/03/21 职场文书
《云房子》教学反思
2014/04/20 职场文书
合同意向书范本
2014/07/30 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
MySQL常用慢查询分析工具详解
2022/08/14 MySQL
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript