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 相关文章推荐
一个阿拉伯数字转中文数字的函数
Oct 09 PHP
利用static实现表格的颜色隔行显示
Oct 09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
smarty的保留变量问题
Oct 23 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
基于php无限分类的深入理解
Jun 02 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
PHP比较运算符的详细介绍
Sep 29 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 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
如何删除多级目录
2006/10/09 PHP
由php的call_user_func传reference引发的思考
2010/07/23 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
js验证上传图片的方法
2015/05/12 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
node中IO以及定时器优先级详解
2019/05/10 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
python杀死一个线程的方法
2015/09/06 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
python如何构建mock接口服务
2021/01/28 Python
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
爱我中华演讲稿
2014/05/20 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
简历自我评价模板
2015/03/11 职场文书
告知书格式
2015/07/01 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python