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 相关文章推荐
echo, print, printf 和 sprintf 区别
Dec 06 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
php 读取文件头判断文件类型的实现代码
Aug 05 PHP
Yii操作数据库的3种方法
Mar 11 PHP
php求两个目录的相对路径示例(php获取相对路径)
Mar 27 PHP
php实现检查文章是否被百度收录
Jan 27 PHP
百度地图API使用方法详解
Aug 25 PHP
php使用文本统计访问量的方法
May 12 PHP
深入理解PHP中的empty和isset函数
May 26 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 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四舍五入精确小数位及取整
2014/01/14 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
总结Javascript中的隐式类型转换
2016/08/24 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
Python语言进阶知识点总结
2019/05/28 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Python正则表达式如何匹配中文
2020/05/27 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
Javascript如何发送一个Ajax请求
2015/01/26 面试题
初级Java程序员面试题
2016/03/03 面试题
九年级家长会邀请函
2014/01/15 职场文书
优秀教师主要事迹
2014/02/01 职场文书
生日宴会主持词
2014/03/20 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
邹越演讲观后感
2015/06/15 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL