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作为Shell脚本语言使用
Oct 09 PHP
PHP4与PHP5的时间格式问题
Feb 17 PHP
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
php实现查询百度google收录情况(示例代码)
Aug 02 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
PHP实现取得HTTP请求的原文
Aug 18 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
laravel-admin 实现给grid的列添加行数序号的方法
Oct 08 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 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 静态页面中显示动态内容
2009/08/14 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
laravel 数据验证规则详解
2019/10/23 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
Python构建XML树结构的方法示例
2017/06/30 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
详解python中init方法和随机数方法
2019/03/13 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
清洁工岗位职责
2014/01/29 职场文书
听课评语大全
2014/04/30 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
大雁塔导游词
2015/02/04 职场文书
MySQL时间设置注意事项的深入总结
2021/05/06 MySQL
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript