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 Smarty生成EXCEL文档的代码
Aug 23 PHP
php 伪造本地文件包含漏洞的代码
Nov 03 PHP
PHP语言中global和$GLOBALS[]的分析 之二
Feb 02 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
destoon官方标签大全
Jun 20 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
PHP二维数组去重实例分析
Nov 18 PHP
浅谈php中curl、fsockopen的应用
Dec 10 PHP
PHP判断密码强度的方法详解
May 26 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 PHP
PHP中用Trait封装单例模式的实现
Dec 18 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
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
js jquery做的图片连续滚动代码
2008/01/06 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
python模块smtplib学习
2018/05/22 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
python实现AES加密和解密
2019/03/27 Python
详解python多线程之间的同步(一)
2019/04/03 Python
家长给幼儿园的表扬信
2014/01/09 职场文书
军训 自我鉴定
2014/02/03 职场文书
总裁助理岗位职责
2014/02/17 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
布达拉宫的导游词
2015/02/02 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android