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 相关文章推荐
mysql 搜索之简单应用
Apr 27 PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
基于PHP文件操作的详解
Jun 05 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
Mar 19 PHP
php远程下载类分享
Apr 13 PHP
几行代码轻松实现PHP文件打包下载zip
Mar 01 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
浅析PHP数据导出知识点
Feb 17 PHP
PHP折半(二分)查找算法实例分析
May 12 PHP
thinkphp5框架API token身份验证功能示例
May 21 PHP
php报错502badgateway解决方法
Oct 11 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截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
python统计一个文本中重复行数的方法
2014/11/19 Python
python实现装饰器、描述符
2018/02/28 Python
代码实例讲解python3的编码问题
2019/07/08 Python
Python Celery多队列配置代码实例
2019/11/22 Python
python range实例用法分享
2020/02/06 Python
Python类中self参数用法详解
2020/02/13 Python
python和php哪个容易学
2020/06/19 Python
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
师说教学反思
2014/02/07 职场文书
售后服务承诺书模板
2014/05/21 职场文书
企业贷款委托书格式
2014/09/12 职场文书
银行贷款收入证明
2014/10/17 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS