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&amp;java(三)
Oct 09 PHP
PHP 在线翻译函数代码
May 07 PHP
php 高性能书写
Dec 11 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
Aug 21 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
Yii2框架数据库简单的增删改查语法小结
Aug 31 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
在 Laravel 6 中缓存数据库查询结果的方法
Dec 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 和 MySQL 基础教程(一)
2006/10/09 PHP
PHP安全性漫谈
2012/06/28 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
php-msf源码详解
2017/12/25 PHP
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
深入理解React高阶组件
2017/09/28 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
python实现ip地址的包含关系判断
2020/02/07 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
应届医学毕业生求职信分享
2013/12/02 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
中学教师教学工作总结
2015/08/13 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技