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中的错误处理、异常处理机制分析
May 07 PHP
解析php5配置使用pdo
Jul 03 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
迁移PHP版本到PHP7
Feb 06 PHP
PHP进程同步代码实例
Feb 12 PHP
PHP使用逆波兰式计算工资的方法
Jul 29 PHP
php数组分页实现方法
Apr 30 PHP
php实现的简单数据库操作Model类
Nov 16 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 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删除数组中特定元素的两种方法
2013/07/02 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
js 幻灯片的实现
2011/12/06 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
浅谈MySQL中的触发器
2015/05/05 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
Python微信公众号开发平台
2018/01/25 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Python for循环与getitem的关系详解
2020/01/02 Python
Python3的socket使用方法详解
2020/02/18 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
计算机本科生自荐信
2013/10/15 职场文书
写好自荐信要注意的问题
2013/11/10 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
高中家长寄语
2014/04/02 职场文书
邀请函怎么写
2015/01/30 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
创业计划书之酒店
2019/08/30 职场文书
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
2021/05/31 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python