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设计模式 Strategy(策略模式)
Jun 26 PHP
PHP简洁函数小结
Aug 12 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
深入解析Session是否必须依赖Cookie
Aug 02 PHP
php写的AES加密解密类分享
Jun 20 PHP
php中define用法实例
Jul 30 PHP
php的socket编程详解
Nov 20 PHP
php基于dom实现的图书xml格式数据示例
Feb 03 PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
Laravel 实现添加多语言提示信息
Oct 25 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使用者状态管理功能的应用
2006/10/09 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
详解json在php中的应用
2018/09/30 PHP
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
vue实现选中效果
2020/10/07 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
python单线程实现多个定时器示例
2014/03/30 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
自荐信怎么写好
2013/11/11 职场文书
学前班教师的自我鉴定
2013/12/05 职场文书
竞争上岗实施方案
2014/03/21 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
2014年测量员工作总结
2014/12/12 职场文书
维稳工作承诺书
2015/01/20 职场文书
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python
MySQL三种方式实现递归查询
2022/04/18 MySQL