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中去除所有js,html,css代码
Oct 12 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
jQuery+php实现ajax文件即时上传的详解
Jun 17 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
php简单图像创建入门实例
Jun 10 PHP
PHP实现搜索相似图片
Sep 22 PHP
关于PHP文件的自动运行方法分析
May 13 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 PHP
PHP中Cookie的使用详解(简单易懂)
Apr 28 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 PHP
PHP实现考试倒计时功能代码
Apr 16 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 冲泡冲煮
thinkphp控制器调度使用示例
2014/02/24 PHP
php把session写入数据库示例
2014/02/26 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
jQuery 1.0.2
2006/10/11 Javascript
简单JS代码压缩器
2006/10/12 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
jQuery实现元素的插入
2017/02/27 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
2018/02/06 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
python读取Excel实例详解
2018/08/17 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
小学数学教学反思
2014/02/02 职场文书
颂军魂爱军营演讲稿
2014/09/13 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
python 网络编程要点总结
2021/06/18 Python