PHP反射API示例分享

 更新时间:2016年10月08日 10:08:55   作者:x_liang  
这篇文章主要为大家分享了PHP反射API示例,利用反射技术实现的插件系统架构,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了 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实现RESTful API的常见问题与解决方案

    使用PHP实现RESTful API的常见问题与解决方案

    RESTful API是一种基于HTTP协议的架构风格,广泛应用于现代Web服务和移动应用开发中,但在开发过程中开发者可能会遇到一些常见问题,下面小编为大家提供一下相应问题的解决方案吧
    2025-03-03
  • sourcesafe管理phpproj文件的补充说明(downmoon)

    sourcesafe管理phpproj文件的补充说明(downmoon)

    在使用vs.php+ sourcesafe管理代码时,发现有时候并不能从vs.net IDE中正确获取phpproj文件下的所有文件。但从sourcesafe IDE下却可以。
    2009-04-04
  • Adnroid 微信内置浏览器清除缓存

    Adnroid 微信内置浏览器清除缓存

    本文主要介绍,微信内置浏览器无法清除缓存的问题.这里整理了一些方法,以供大家学习参考,希望能帮到有需要的小伙伴
    2016-07-07
  • php短信接口代码

    php短信接口代码

    这篇文章主要为大家详细介绍了php短信接口代码,php短信发送、php批量发送、php获取余额等代码,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • php静态文件生成类实例分析

    php静态文件生成类实例分析

    这篇文章主要介绍了php静态文件生成类,以实例形式较为详细的分析了使用php生成静态文件的方法及使用技巧,需要的朋友可以参考下
    2015-01-01
  • PHP实现通过文本文件统计页面访问量功能示例

    PHP实现通过文本文件统计页面访问量功能示例

    这篇文章主要介绍了PHP实现通过文本文件统计页面访问量功能,涉及php文件读写、数值计算及图形操作相关实现技巧,需要的朋友可以参考下
    2019-02-02
  • php 静态化实现代码

    php 静态化实现代码

    Replace函数用于将从模版文件中读取的内容中的关键字替换成变量中的内容
    2009-03-03
  • 解析php5配置使用pdo

    解析php5配置使用pdo

    本篇文章是对php5配置使用pdo的方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • php中jQuery插件autocomplate的简单使用笔记

    php中jQuery插件autocomplate的简单使用笔记

    刚接触jQuery,时间不太长,以下文章只限于参考使用。查了一部分资料,最后终于写成功了,只是单纯的实现,其它的特殊用法还没有进行深入研究,简单贴出来,希望可以给新手一个参考
    2012-06-06
  • php中照片旋转 (orientation) 问题的正确处理

    php中照片旋转 (orientation) 问题的正确处理

    这篇文章主要介绍了php中照片旋转 (orientation) 问题的正确处理,文中给出了详细的介绍和示例代码,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。
    2017-02-02

最新评论