zoukankan      html  css  js  c++  java
  • 反射查找插件

    <?php
    echo '<pre>';
    
    //定义一个测试反射的类
    class CQH
    {
        public $name = 'cqh';
        private $country= 'china';
        const gender = 'man';
        public function say()
        {
            echo 'hello,world';
        }
        private function eat()
        {
            echo 'eat';
        }
        public static function drink()
        {
            echo 'drink';
        }
    }
    
    /*  //打印所有的反射接口
        Reflection::export(new ReflectionExtension('reflection')); */
    
    /*  //反射创建所有的PHP类的导出结果,get_declared_classes可以获取所有已声明的类
        foreach(get_declared_classes() as $class)
        {
            Reflection::export(new ReflectionClass($class));
        } */
    
    /*  //只反射用户自己定义的类
        foreach(get_declared_classes() as $class)
        {
            $reflectionClass = new ReflectionClass($class);
            if($reflectionClass->isUserDefined())
            {
                Reflection::export($reflectionClass);
            }
        } */
    
        /********************************使用反射查找插件********************************/
    	//定义一个接口
        interface IPlugin
        {
            public static function getName();
        }
    
        //查到所有实现了IPlugin接口的类
        function findPlugins()
        {
            $plugins = array();
            foreach(get_declared_classes() as $class)
            {
                $reflectionClass = new ReflectionClass($class);
                if($reflectionClass->implementsInterface('IPlugin'))
                {
                    $plugins[] = $reflectionClass;
                }
            }
            return $plugins;
        }
        //确定用于菜单的类的成员
        function computeMenu()
        {
            $menu = array();
            foreach(findPlugins() as $plugins)
            {
                $reflectionMethod = $plugins->getMethod('getMenuItems');
                if($reflectionMethod->isStatic())
                {
                    $items = $reflectionMethod->invoke(null);
                }
                else
                {
                    //如果这个方法不是静态的,我们需要一个实例
                    $pluginsInstance = $plugins->newInstance();
                    $items = $reflectionMethod->invoke($pluginsInstance);
                }
                $menu = array_merge($menu,$items);
            }
            return $menu;
        }
        //确定用于文章的侧边栏的类的成员
        function computeArticles()
        {
            $articles = array();
            foreach(findPlugins() as $plugin)
            {
                if($plugin->hasMethod('getArticles'))
                {
                    $reflectionMethod = $plugin->getMethod('getArticles');
                    if($reflectionMethod->isStatic())
                    {
                        $items = $reflectionMethod->invoke(null);
                    }
                    else
                    {
                        $pluginInstance = $plugin->newInstance();
                        $items = $reflectionMethod->invoke($pluginInstance);
                    }
                    $articles = array_merge($articles,$items);
                }
            }
            return $articles;
        }
        //确定侧边栏的的类的成员
        function computeSidebars()
        {
            $sidebars = array();
            foreach(findPlugins() as $plugin)
            {
                if($plugin->hasMethod('getSidebars'))
                {
                    $reflectionMethod = $plugin->getMethod('getSidebars');
                    if($reflectionMethod->isStatic())
                    {
                        $items = $reflectionMethod->invoke(null);
                    }
                    else
                    {
                        $pluginInstance = $plugin->newInstance();
                        $items = $reflectionMethod->invoke($pluginInstance);
                    }
                    $sidebars = array_merge($sidebars,$items);
                }
            }
            return $sidebars;
        }
        //创建一个实现了Iplugin接口的类
        class MyCoolPlugin implements IPlugin
        {
            public static function getName()
            {
                return 'MyCoolPlugin';
            }
    
            public static 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' => 'This article is cool because...'
                ));
            }
        }
    
        $menu = computeMenu();
        $sidebars = computeSidebars();
        $articles = computeArticles();
        print_r($menu);
        print_r($sidebars);
        print_r($articles);
    
        echo '</pre>';
    ?>
    
  • 相关阅读:
    数据结构与算法20170804
    设计模式之抽象工厂模式20170803
    设计模式之建造者模式20170802
    设计模式之工厂方法模式20170801
    设计模式之中介者模式20170731
    设计模式之门面模式20170728
    设计模式之适配器模式20170727
    设计模式之装饰模式20170726
    AndroidStudio 开发JNI
    NDK开发: 打印C代码的调试信息Log
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/4482272.html
Copyright © 2011-2022 走看看