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实现分页的一个示例
Oct 09 PHP
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
php下过滤HTML代码的函数
Dec 10 PHP
用php+javascript实现二级级联菜单的制作
May 06 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
Apr 15 PHP
php对数组排序代码分享
Feb 24 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
Mar 17 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
PHP强制转化的形式整理
May 22 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 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和.net的区别
2014/09/28 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
python编写Logistic逻辑回归
2020/12/30 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
numpy.random模块用法总结
2019/05/27 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
python自动发微信监控报警
2019/09/06 Python
python字符串格式化方式解析
2019/10/19 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
捷克时尚网上商店:OTTO
2018/03/15 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
护理专业毕业生自我鉴定
2013/10/08 职场文书
公司庆典活动邀请函
2014/01/09 职场文书
幼教求职信
2014/03/12 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
感谢信的技巧及范例
2019/05/15 职场文书
python 单机五子棋对战游戏
2022/04/28 Python
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python