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 相关文章推荐
PHP数字格式化
Dec 06 PHP
一篇不错的PHP基础学习笔记
Mar 18 PHP
人尽可用的Windows技巧小贴士之下篇
Mar 22 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
PHP学习笔记 (1) 环境配置与代码调试
Jun 19 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
php与flash as3 socket通信传送文件实现代码
Aug 16 PHP
orm获取关联表里的属性值
Apr 17 PHP
CI框架常用方法小结
May 17 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
php的ajax简单实例
2014/02/27 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
js实现简单点赞操作
2020/03/17 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
跟老齐学Python之数据类型总结
2014/09/24 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
通过实例解析python描述符原理作用
2020/01/22 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
python的launcher用法知识点总结
2020/08/07 Python
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
学习雷锋标语
2014/06/25 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
教师网络培训心得体会
2016/01/09 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android