PHP反射API示例分享

5年以前  |  阅读数:1079 次  |  编程语言:PHP 

本文实例为大家分享了 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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例