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 相关文章推荐
php缓存技术介绍
Nov 25 PHP
PHP Document 代码注释规范
Apr 13 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
基于PHP array数组的教程详解
Jun 05 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
Yii实现多按钮保存与提交的方法
Dec 03 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
laravel实现上传图片的两种方式小结
Oct 12 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代码
2010/08/08 PHP
php表单提交实例讲解
2015/11/12 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
可输入的下拉框
2006/06/19 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
详解python时间模块中的datetime模块
2016/01/13 Python
python中PIL安装简单教程
2016/04/21 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
django Admin文档生成器使用详解
2019/07/22 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Python流程控制 while循环实现解析
2019/09/02 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
python飞机大战游戏实例讲解
2020/12/04 Python
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
公积金转移接收函
2014/01/11 职场文书
酒店端午节促销方案
2014/02/18 职场文书
完美的中文自荐信
2014/05/24 职场文书
个人查摆剖析材料
2014/10/16 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
单位证明范文
2015/06/18 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
Spring 使用注解开发
2022/05/20 Java/Android