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学习笔记(三)操作符与控制结构
Aug 06 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
php实现CSV文件导入和导出
Oct 24 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
Yii2数据库操作常用方法小结
May 04 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
php插入mysql数据返回id的方法
May 31 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP unset函数原理及使用方法解析
Aug 14 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
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
php读取msn上的用户信息类
2008/12/05 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
jquery中动态效果小结
2010/12/16 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
一分钟理解js闭包
2016/05/04 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
基于Python实现文件大小输出
2016/01/11 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
python numpy元素的区间查找方法
2018/11/14 Python
python内置模块collections知识点总结
2019/12/19 Python
Python安装whl文件过程图解
2020/02/18 Python
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
工地安全质量标语
2014/06/07 职场文书
六一亲子活动总结
2014/07/01 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
入股合作协议书
2014/10/12 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
户外活动总结
2015/02/04 职场文书
退税申请报告怎么写
2015/05/18 职场文书
家长通知书家长意见
2015/06/03 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
如何在Python项目中引入日志
2021/05/31 Python