php利用反射实现插件机制的方法


Posted in PHP onMarch 14, 2015

本文实例讲述了php利用反射实现插件机制的方法。分享给大家供大家参考。具体实现方法如下:

<?php

/**

 * @name    PHP反射API--利用反射技术实现的插件系统架构

 */   

interface Iplugin{   

    public static function getName();   

}   

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 $plugin){   

        if ($plugin->hasMethod('getMenuItems')) {   

            $reflectionMethod = $plugin->getMethod('getMenuItems');   

            if ($reflectionMethod->isStatic()) {   

                $items = $reflectionMethod->invoke(null);   

            } else {   

                $pluginInstance = $plugin->newInstance();   

                $items = $reflectionMethod->invoke($pluginInstance);   

            }   

            $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;   

}   

class MycoolPugin 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'=> 'xxxxxxxxx' ));   

    }   

}

$menu = computeMenu();   

$articles    = computeArticles();   

print_r($menu);   

print_r($articles);

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
多php服务器实现多session并发运行
Oct 09 PHP
PHP 如何向 MySQL 发送数据
Oct 09 PHP
用PHP实现维护文件代码
Jun 14 PHP
PHP警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
php新建文件的方法实例
Sep 26 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 #PHP
php读取csv文件并输出的方法
Mar 14 #PHP
php列出mysql表所有行和列的方法
Mar 13 #PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 #PHP
PHP 验证登陆类分享
Mar 13 #PHP
php检索或者复制远程文件的方法
Mar 13 #PHP
php通过文件流方式复制文件的方法
Mar 13 #PHP
You might like
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
php上传后台无法收到数据解决方法
2019/10/28 PHP
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
jquery选择器中的空格与大于号&gt;、加号+与波浪号~的区别介绍
2016/06/24 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
详解vue-router基本使用
2017/04/18 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python中的枚举类型示例介绍
2019/01/09 Python
python的移位操作实现详解
2019/08/21 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
python的faker库用法
2019/11/28 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
详解python中的异常捕获
2020/12/15 Python
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
服装仓管员岗位职责
2014/06/17 职场文书
钱学森观后感
2015/06/04 职场文书
导游带团欢迎词
2015/09/30 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript