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.MVC的模板标签系统(三)
Sep 05 PHP
phpBB BBcode处理的漏洞
Oct 09 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
解析mysql left( right ) join使用on与where筛选的差异
Jun 18 PHP
php合并数组中相同元素的方法
Nov 13 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 PHP
laravel通用化的CURD的实现
Dec 13 PHP
php输出形式实例整理
May 05 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 session机制
2011/07/17 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
js查错流程归纳
2012/05/04 Javascript
js单例模式的两种方案
2013/10/22 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
jQuery动态添加
2016/04/07 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
webpack入门必知必会
2017/01/16 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
webpack4从0搭建组件库的实现
2020/11/29 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
外贸英语专业求职信范文
2013/12/25 职场文书
幼儿园保育员辞职信
2014/01/12 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
五五普法心得体会
2014/09/04 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
JavaScript的function函数详细介绍
2021/11/20 Javascript
SQLServer常见数学函数梳理总结
2022/08/05 MySQL