PHP基于反射机制实现插件的可插拔设计详解


Posted in PHP onNovember 10, 2016

本文实例讲述了PHP基于反射机制实现插件的可插拔设计。分享给大家供大家参考,具体如下:

说PHP和ASP等同的朋友们可以就此打住了,PHP支持反射,而且还是非常的强大。好了,我们开始今天的话题。

功能描述:

页面拥有一个主导航菜单,里头有默认连接若干。
插件统一存放在一个目录,插件载入后会自动在导航菜单中增加上自己所需的链接。
插件载入时可执行一定的操作。
动态增删插件无需改动代码。

最终效果:

首页,插件1,插件2

"首页"是系统自带的菜单项。"插件1"和"插件2"是由插件注册的菜单项。

实现过程:

1. 文件结构

Learn
plugin
plugin1.php
plugin2.php
test.php

如此设计后,页面入口为test.php,插件都存放在plugin目录下,只要遍历plugin目录就可以找到所有的插件了。

2. 设计插件接口

interface IPlugin{
static function getname();
static function init();
static function getMenu();
}

3. 插件内部实现接口

Plugin1实现接口:

<?php
Class Welcome implements IPlugin{
static function getname(){
return 'Welcome (Plugin)';
}
static function getMenu(){
return array(
'text'=>'插件1′,
'href'=>'http://www.google.com'
);
}
static function init(){
echo self::getname() . " 载入中…<br />";
}
}
?>

Plugin2实现接口:

<?php
Class ShowAD implements IPlugin{
static function getname(){
return 'Show AD (Plugin)';
}
static function getMenu(){
return array(
'text'=>'插件2′,
'href'=>'http://www.live.com'
);
}
static function init(){
echo self::getname() . " 载入中…<br />";
}
}
?>

4. 主页面初始化主导航菜单

$menu[] = array(
'text'=>'首页',
'href'=>'/test.php'
);

5. 遍历插件目录,载入全部插件

$pluginPath = $_SERVER['DOCUMENT_ROOT'] . '/plugin';
$dirHd = opendir($pluginPath);
while ($file = readdir($dirHd)){
$pluginFilePath = $pluginPath . '/' . $file;
if($file!='.' && $file!='..' && is_file($pluginFilePath)){
include "$pluginFilePath";
}
}

6. 过滤出实现了IPlugin接口的插件,并执行插件注入操作。

// 反射执行方法(注入菜单)
foreach (get_declared_classes() as $class){
$refClass = new ReflectionClass($class);
if($refClass->implementsInterface('IPlugin')){
//插件初始化
$refClass->getMethod('init')->invoke(null);
//获取注入菜单
$menuItem = $refClass->getMethod('getMenu')->invoke(null);
//合并菜单项
$menu = array_merge($menu, array($menuItem));
}
}

7. 主页面输出菜单HTML

foreach ($menu as $m){
echo "<a href='{$m['href']}'>{$m['text']}</a> ";
}

注意第6部就是PHP的反射操作,是不是很简单呢。分析下其中代码,一个完整的反射操作时机只有2行代码!

$refClass = new ReflectionClass($class);
$menuItem = $refClass->getMethod('getMenu')->invoke(null);

好了,反射的基本功能就介绍到这了。当然了,PHP的反射功能不仅仅如此,有兴趣的自己发掘去吧。

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

PHP 相关文章推荐
pw的一个放后门的方法分析
Oct 08 PHP
PHP学习笔记之数组篇
Jun 28 PHP
php文件操作实例代码
May 10 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
PHP程序员必须清楚的问题汇总
Dec 18 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 PHP
PHP yii实现model添加默认值的方法(两种方法)
Nov 10 #PHP
PHP实现的曲线统计图表示例
Nov 10 #PHP
PHP  Yii清理缓存的实现方法
Nov 10 #PHP
PHP模拟http请求的方法详解
Nov 09 #PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 #PHP
浅析php-fpm静态和动态执行方式的比较
Nov 09 #PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 #PHP
You might like
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
php上传excel表格并获取数据
2017/04/27 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
javascript中 try catch用法
2015/08/16 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
Python序列循环移位的3种方法推荐
2018/04/09 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
PHP如何自定义函数
2016/09/16 面试题
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
外包公司软件测试工程师
2014/11/01 面试题
小组合作学习反思
2014/02/18 职场文书
高中生家长寄语大全
2014/04/03 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
2014年会策划方案
2014/05/11 职场文书
商业街策划方案
2014/05/31 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
高一军训决心书
2015/02/05 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书