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的urlencode()URL编码函数浅析
Aug 09 PHP
PHP session会话的安全性分析
Sep 08 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
PHP实现的增强性mhash函数
May 27 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
PHP 接入支付宝即时到账功能
Sep 18 PHP
如何修改yii2.0自带的user表为其它的表
Aug 01 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
php给数组赋值的实例方法
Sep 26 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 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代码DOS造成用光网络带宽
2011/03/01 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
python+logging+yaml实现日志分割
2019/07/22 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
python 自动识别并连接串口的实现
2021/01/19 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
汉森批发:Hansen Wholesale
2018/05/24 全球购物
小学生植树节活动总结
2014/07/04 职场文书
校外活动方案
2014/08/28 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
公司费用报销管理制度
2015/08/04 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python