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中判断一个请求是ajax请求还是普通请求的方法
Jun 28 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
php创建、获取cookie及基础要点分析
Jan 26 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
smarty高级特性之过滤器的使用方法
Dec 25 PHP
php关闭warning问题的解决方法
May 17 PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 PHP
总结PHP内存释放以及垃圾回收
Mar 29 PHP
使用PHPWord生成word文档的方法详解
Jun 06 PHP
php实现对文件压缩简单的方法
Sep 29 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 5.3.0 安装分析心得
2009/08/07 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
python3.7调试的实例方法
2020/07/21 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
教师党员思想汇报
2014/01/06 职场文书
文科教师毕业的自我评价
2014/01/16 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
护理实习生带教计划
2015/01/16 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
公司借款担保书
2015/09/22 职场文书
python 中的@运算符使用
2021/05/26 Python