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 相关文章推荐
用缓存实现静态页面的测试
Dec 06 PHP
php ci框架中加载css和js文件失败的原因及解决方法
Jul 29 PHP
php修改指定文件后缀的方法
Sep 11 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
php运行时动态创建函数的方法
Mar 16 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
Dec 31 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
Jun 14 PHP
浅析PHP7 的垃圾回收机制
Sep 06 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
dedecms模板标签代码官方参考
2007/03/17 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
python将视频转换为全字符视频
2019/04/26 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
Python shutil模块用法实例分析
2019/10/02 Python
dpn网络的pytorch实现方式
2020/01/14 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
长安大学毕业生自我鉴定
2014/01/17 职场文书
大学毕业自我鉴定范文
2014/02/03 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
营销计划书范文
2015/01/17 职场文书
元宵节晚会主持词
2015/07/01 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
python 实现图片特效处理
2022/04/03 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android