PHP反射API示例分享


Posted in PHP onOctober 08, 2016

本文实例为大家分享了 PHP反射API--利用反射技术实现的插件系统架构,供大家参考,具体内容如下

<?php
/**
 * @name  PHP反射API--利用反射技术实现的插件系统架构
 */


/**
 * 先调用findPlugins方法获取到获取到实现了接口的类
 * 然后调用反射类的方法
 * @param $method  方法名
 * @param $interfaceName  接口名
 * @return array  方法名对应的返回结果
 */
function compute($method,$interfaceName){
  $findPlugins = findPlugins($interfaceName);
  $menu = array();
  foreach ($findPlugins as $plugin){   //这里获取到实现Iplugin接口的所有的类
    if ($plugin->hasMethod($method)) {    //检查在类中特定的方法是否被定义。
      $reflectionMethod = $plugin->getMethod($method);   //获取类中的方法
      if ($reflectionMethod->isStatic()) {    //判断其方法是否为静态方法
        $items = $reflectionMethod->invoke(null);
      } else {
        $pluginInstance = $plugin->newInstance();  //创建类的新实例。给定参数传递给类构造函数。
        $items = $reflectionMethod->invoke($pluginInstance);
      }
      $menu = array_merge($menu, is_array($items)?$items:[$items]);
    }
  }
  return $menu;
}

/**
 * 首先从一堆已定义的类中找到实现Iplugin接口的类
 * 然后将其存放在数组中 return
 * @param string      $interfaceName
 * @return array      $plugins
 */
function findPlugins($interfaceName){
  $plugins = array();
  //返回由已定义类的名字所组成的数组
  foreach (get_declared_classes() as $class){
    $reflectionClass = new ReflectionClass($class);//获得class的反射对象,包括私有的属性方法
    if ($reflectionClass->implementsInterface($interfaceName)) {   //检查它是否实现了Iplugin接口
      $plugins[] = $reflectionClass;   //找到需要反射的类
    }
  }
  return $plugins;
}
interface Iplugin{
  public static function getName();  //定义接口和静态方法
}
//实现Iplugin接口
class MycoolPugin implements Iplugin {
  public static function getName(){
    return 'MycoolPlugin';
  }
  public 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' ));
  }
}

$menu = compute('getMenuItems','Iplugin');
$articles  = compute('getArticles','Iplugin');
print_r($menu);
echo "<hr>";
print_r($articles);
echo "<hr>";
$name = compute('getName','Iplugin');
print_r($name);

/*
  new class和new ReflectionClass的区别是什么
  1、new $class() 实例化class对象
  2、new ReflectionClass($class) 获得class的反射对象(包含了元数据信息)
  区别:
  1、new出来的class,你不能访问他的私有属性/方法,但反射可以。
  2、反射返回的对象是class的元数据对象(包含class的所有属性/方法的元数据信息),但不是类本身;类似于查到了类的户口档案,但户口档案不是人!
*/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
如何将一个表单同时提交到两个地方处理
Oct 09 PHP
dedecms中显示数字验证码的修改方法
Mar 21 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
Nov 18 PHP
php 文件上传系统手记
Oct 26 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
PHP中文分词的简单实现代码分享
Jul 17 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
php遍历树的常用方法汇总
Jun 18 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 PHP
验证坐标在某坐标区域内php代码
Oct 08 #PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 #PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
Oct 08 #PHP
php文件类型MIME对照表(比较全)
Oct 07 #PHP
php中文字符串截取多种方法汇总
Oct 06 #PHP
PHP微信红包生成代码分享
Oct 06 #PHP
php下载文件超时时间的设置方法
Oct 06 #PHP
You might like
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
微信小程序页面间通信的5种方式
2017/03/31 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
python操作kafka实践的示例代码
2019/06/19 Python
python实现最速下降法
2020/03/24 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
工作迟到检讨书
2014/02/21 职场文书
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
绘画专业自荐信
2014/07/04 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python