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 相关文章推荐
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
Dec 29 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
Jul 04 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
php class类的用法详细总结
Oct 17 PHP
浅析echo(),print(),print_r(),return之间的区别
Nov 27 PHP
PHP 动态生成静态HTML页面示例代码
Jan 15 PHP
php获取apk包信息的方法
Aug 15 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
php模板原理讲解
2013/11/13 PHP
Laravel5中contracts详解
2015/03/02 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
2016/06/01 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
Python 专题三 字符串的基础知识
2017/03/19 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Python eval函数原理及用法解析
2020/11/14 Python
python操作toml文件的示例代码
2020/11/27 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
出生证明公证书
2014/04/09 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
实习科室评语
2015/01/04 职场文书
高中生自我评价范文2015
2015/03/03 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
php png失真的原因及解决办法
2021/10/24 PHP