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 相关文章推荐
3.从实例开始
Oct 09 PHP
PHP伪静态页面函数附使用方法
Jun 20 PHP
PHP的单引号和双引号 字符串效率
May 27 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
php顺序查找和二分查找示例
Mar 27 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
php数组去除空值函数分享
Feb 02 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 PHP
laravel config文件配置全局变量的例子
Oct 13 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
python统计一个文本中重复行数的方法
2014/11/19 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
pandas值替换方法
2018/07/10 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
python中with用法讲解
2020/02/07 Python
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
远程教育心得体会
2014/01/03 职场文书
领导接待方案
2014/03/13 职场文书
新闻发布会策划方案
2014/06/12 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
个人求职自荐信范文
2015/03/06 职场文书
cf战队宣传语
2015/07/13 职场文书
领导新年致辞2016
2015/07/29 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
一文搞懂python异常处理、模块与包
2021/06/26 Python