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 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
PHP根据IP地址获取所在城市具体实现
Nov 27 PHP
PHP Session机制简介及用法
Aug 19 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 PHP
Laravel中服务提供者和门面模式的入门介绍
Nov 06 PHP
php生成HTML文件的类方法
Oct 11 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 global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
DOM 中的事件处理介绍
2012/01/18 Javascript
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
JS跨域代码片段
2012/08/30 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
javascript中this的四种用法
2015/05/11 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
Python删除windows垃圾文件的方法
2015/07/14 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
利用python开发app实战的方法
2019/07/09 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
python 实现矩阵按对角线打印
2019/11/29 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
文秘应聘自荐书范文
2014/02/18 职场文书
彩色的非洲教学反思
2014/02/18 职场文书
环境工程专业自荐信
2014/03/03 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
群众路线调研报告范文
2014/11/03 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
介绍信怎么写
2015/05/05 职场文书
加薪申请报告范本
2015/05/15 职场文书
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
Python+Tkinter制作专属图形化界面
2022/04/01 Python
讨论nginx location 顺序问题
2022/05/30 Servers