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中使用addslashes函数报错问题的解决方法
Feb 06 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
2014过年倒计时示例
Jan 31 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
php中使用sftp教程
Mar 30 PHP
PHP借助phpmailer发送邮件
May 11 PHP
分享PHP计算两个日期相差天数的代码
Dec 23 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 PHP
php源码的安装方法和实例
Sep 26 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 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防CC攻击实现代码
2011/12/29 PHP
php中autoload的用法总结
2013/11/08 PHP
php链表用法实例分析
2015/07/09 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
jQuery中Form相关知识汇总
2015/01/06 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
详解vue组件中使用路由方法
2019/02/12 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
python读文件逐行处理的示例代码分享
2013/12/27 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python3调用R的示例代码
2018/02/23 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
办公室文秘自我评价
2013/09/21 职场文书
财务人员个人求职信范文
2013/12/04 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
精神文明建设标语
2014/06/16 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
工会趣味活动方案
2014/08/18 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL