PHP插件技术-插件钩子(hooks)分析
最近准备做一个开源的个人博客系统,因为在构想中要添加插件功能,所以就研究了一下插件功能的实现方法。
插件的功能按照本人自己的理解就是对已有的程序进行功能方面的添加以及改进,插件要与程序所提供的接口进行连接,然后通过已经连接的接口对程序的数据等等进行修改。
而插件钩子的作用就类似于一个插件接口,插件与程序内相应的钩子进行连接,对程序提供的内容进行修改。
我的插件机制全部是采用面向对象的方式进行架构的,在开始要对插件进行初始化,就是使用一个数组将插件的名称存放起来,以供后续的钩子进行调用。
$plug_config[]=array(
'plug_name'=>'onePlug',
'plug_version'=>'1.01'
);
这个插件的功能我就是想对一段html内容添加一个好看的样式,插件我是放在./root/ext文件夹内,以插件名作为插件文件夹的名称,main.php作为插件的主调用入口。
插件的内部是一个以插件名为类名的Class。
<?php class onePlug{
function __construct(){
global $plug_tem_global; $temarr=explode('<br>',$plug_tem_global); $plug_tem_global='<div style="width:200px;padding:100px 80px;border-radius:200px;margin:100px auto;background-color:#c33;text-align:center;color:#fff;font-family:微软雅黑;">'.implode("<br><br>",$temarr).'</div>'; }
}
这个 global $plug_tem_global; 是使用一个全局变量$plug_tem_global作为传入内容的参数,对它进行修改就相当于对内容进行修改。
在插件机制的主文件中,插件钩子作为一个调用插件的接口,它其实是一个字符串变量,其内部的值就是存放插入当前位置插件的数组的名称
比如说上面插件初始化的数组名称为plug_config,那么此处的插件钩子就是$plug_config,由于要在类的内部对这个变量进行操作,所以使用global将他变成了一个全局变量。
$plug_point_name='plug_config';
global $$plug_point_name;
对于插件的执行,在内部使用了一个循环来执行适用于当前钩子的所有插件
$plug_tem_arr=$$plug_point_name; $plug_num=count($plug_tem_arr);
for($plug_i=0;$plug_i<$plug_num;$plug_i++){
if(isset($plug_tem_arr[$plug_i]['plug_name'])){
$plug_name=$plug_tem_arr[$plug_i]['plug_name'];
$plug_file_address=Root.'ext'.DIRECTORY_SEPARATOR .$plug_name.DIRECTORY_SEPARATOR .'main.php';
if(file_exists($plug_file_address)){
require($plug_file_address);
$plug_tem_obj=new $plug_name();
}
}
}
下面就是我不使用插件与使用插件后的效果对比,哈哈~ 从前有座山……
PHP插件技术-插件钩子(hooks)分析的更多相关文章
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- .NET插件技术-应用程序热升级
今天说一说.NET 中的插件技术,即 应用程序热升级.在很多情况下.我们希望用户对应用程序的升级是无感知的,并且尽可能不打断用户操作的. 虽然在Web 或者 WebAPI上,由于多点的存在可以逐个停用 ...
- 【腾讯Bugly干货分享】Android 插件技术实战总结
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/1p5Y0f5XdVXN2EZYT0AM_A 前言 安 ...
- Unity时钟定时器插件——Vision Timer源码分析之二
Unity时钟定时器插件——Vision Timer源码分析之二 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面的已经介绍了vp_T ...
- Atitit.java的浏览器插件技术 Applet japplet attilax总结
Atitit.java的浏览器插件技术 Applet japplet attilax总结 1. Applet类及各个方法说明 1 2. JApplet类示例 2 3. / 用main方法运行JAp ...
- idea插件篇之java内存分析工具(JProfiler)
前言在运行java的时候有时候想测试云运行时占用内存情况,这时候就需要使用测试工具查看了.在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在i ...
- Mybatis 插件使用及源码分析
Mybatis 插件 Mybatis插件主要是通过JDK动态代理实现的,插件可以针对接口中的方法进行代理增强,在Mybatis中比较重要的接口如下: Executor :sql执行器,包含多个实现类, ...
- Pytest权威教程19-编写钩子(Hooks)方法函数
目录 编写钩子(Hooks)函数 钩子函数验证和执行 firstresult: 遇到第一个有效(非None)结果返回 hookwrapper:在其他钩子函数周围执行 钩子(Hooks)函数排序/调用示 ...
- 大文件上传插件webupload插件
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
随机推荐
- 移动端类似IOS的滚动年月控件(需要jQuery和iScroll)
一. 效果图 二. 功能介绍 支持滚动和点击选择年月.(目前只支持设置年月的最大最小值,不支持整体的最大最小值) 三. 代码 1. 在你的html中添加如下代码: 直接加载<body>里面 ...
- sqlserver:同一数据库内负责表结构。
select * into 新表 from 旧表 where 1=2; ## where 表示要携带的数据,随便写个恒不等式就可以只复制表结构不携带数据.
- Chrome developer tool:本人钟爱的 console、Network 功能简谈
在最开始时,本人调试查看网页,一直用的是 firefox 的 firebug 插件,并没有使用 chrome 的 developer tool .只不过,在日常生活使用过程中,一直使用的是 chrom ...
- thinkphp 3+ 观后详解 (1)
最近面试了一些公司,发现自己的对于架构能力的不足,于是决定开始从最基本的代码做起.先看看大牛们怎么架构整个框架的.鉴于国外的框架比较难懂,于是就选择了国内比较流行的thinkphp来进行研究. 下面写 ...
- PostgreSQL关闭不了时怎么办
停止模式分为: smart, fast, immediate : 分别对应着: SIGTERM, SIGINT, SIGQUIT 信号 当我采用 fast模式无法关机的时候,可以使用如下办法: ...
- Windows常用性能计数器总结
基础监控: Processor:% Processor Time CPU当前利用率,百分比 Memory:Available MBytes 当前可用内存,兆字节(虚拟内存不需要监控,只有当物理内存不够 ...
- jquery,extjs中的extend用法小结
在jquery中,extend其实在做插件时还是用的比较多的,今天同时小结jquery和ext js中 的extend用法,先来看jquery中的. 1) extend(dest,src1,src2 ...
- cdoj 93 King's Sanctuary 傻逼几何题
King's Sanctuary Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/sho ...
- 【JavsScript】一个元素绑定多个事件
<script> document.getElementById("a").addEventListener("click", function() ...
- iOS-自定义导航栏后侧滑返回功能失效
iPhone有一个回退按钮在所有的导航条上.这是一个简单的没有文字箭头. 在一开始写项目的时候,就要做好一个准备,导航栏是自定义还是使用系统的,后期有什么改动,有什么比较特殊的需求.当然这些在更改需求 ...