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 相关文章推荐
dedecms系统常用术语汇总
Apr 03 PHP
PHP面向对象概念
Nov 06 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 PHP
PHP rsa加密解密使用方法
Apr 27 PHP
PHP多态代码实例
Jun 26 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
php中的钩子理解及应用实例分析
Aug 30 PHP
php面向对象重点知识分享
Sep 27 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
如何在PHP中使用数组
Jun 09 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实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
js实现中文实时时钟
2020/01/15 Javascript
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
Python中的rjust()方法使用详解
2015/05/19 Python
python读写json文件的简单实现
2017/04/11 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
python画双y轴图像的示例代码
2019/07/07 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
Python实现图片添加文字
2019/11/26 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
施工安全协议书
2013/12/11 职场文书
学生会招新策划书
2014/02/14 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
高一新生军训感言
2014/03/02 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
实施意见格式范本
2015/06/05 职场文书