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批量生成随机用户名
Jul 10 PHP
php 变量定义方法
Jun 14 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
php分页函数完整实例代码
Sep 22 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php可生成缩略图的文件上传类实例
Dec 17 PHP
Web程序工作原理详解
Dec 25 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
Yii多表联合查询操作详解
Jun 02 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 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
微信扫描二维码登录网站代码示例
2013/12/30 PHP
javascript函数库-集合框架
2007/04/27 Javascript
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
jquery 经典动画菜单效果代码
2010/01/26 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
Python中input和raw_input的一点区别
2014/10/21 Python
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
Django中间件实现拦截器的方法
2018/06/01 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
2014大四本科生自我鉴定总结
2014/10/04 职场文书
房贷收入证明范本
2015/06/12 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis
SQL Server内存机制浅探
2022/04/06 SQL Server
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python