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 相关文章推荐
如何在WIN2K下安装PHP4.04
Oct 09 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
PHP5.2下preg_replace函数的问题
May 08 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
谈谈新手如何学习PHP
2006/12/14 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
基于php实现的验证码小程序
2016/12/13 PHP
php实现的二分查找算法示例
2017/06/20 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
python实现下载整个ftp目录的方法
2017/01/17 Python
Python3 Random模块代码详解
2017/12/04 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
如何写python的配置文件
2020/06/07 Python
pytorch实现查看当前学习率
2020/06/24 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
建材投资建议书
2014/05/16 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技