博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制
阅读量:6068 次
发布时间:2019-06-20

本文共 1382 字,大约阅读时间需要 4 分钟。

所谓Hook机制,是从Windows编程中流行开的一种技术。今天就教大家这么一个技术点,希望对那些有帮助的人有所帮助;

在给大家分享之前,这里推荐下我自己建的PHP开发-VIP资料出售平台 :638965404,不管你是小白还是大牛,我都挺欢迎,不定期分享干货,包括2017最新的PHP企业案例学习资料和零基础入门教程,以及面试宝典,欢迎初学和进阶中的小伙伴,大家一起交流学习,共同进步

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

所谓Hook机制,其主要思想是提前在可能增加功能的地方埋好(预设)一个钩子,这个钩子并没有实际的意义,当我们需要重新修改或者增加这个地方的逻辑的时候,把扩展的类或者方法挂载到这个点即可。

举个简单的例子,我们现在要写一个用户注册的功能,如下图:

/App/Home/Controller/IndexController.class.php

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

突然有一天,客户说我需要增加一个功能,新用户注册奖励50积分,那我只好这样写:

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

客户看了很满意,但是你的另一个同事需要你的代码,你跟他说自己从git上pull。客户又提出一个要求,要在用户注册后给用户发一个邮件(忍住(╬▔皿▔)),那你会这样做:

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

如果在一个项目中,有大量的类似修改,你该怎么办?就那么修改?项目只会越来越臃肿,越发的杂乱不堪。捅死客户?别闹了,犯法的ㄟ( ▔, ▔ )ㄏ。辞职?想想房贷,再想想妻儿老小,我忍(。・`ω´・)。ps:程序员哪来的妻儿...( ̄∀ ̄)

言归正传,最好解决办法就是使用钩子机制。

首先来看一下我们写的Hook类:

/CutePHP/Lib/Cute/Hook.class.php

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

这是我仿照TP的Hook写的一个简单的Hook类,该类中包含了一个静态的私有属性Hooks用于记录所有已经注册的钩子

add方法传入钩子的名称和方法,即可将这个钩子存入数组中,listen则是用于监听某个钩子,只要有这个钩子将调用exec方法执行这个钩子

我们来测试一下,首先在/App/Home/Controller.class.php中埋入钩子:

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

然后在/App/Home/Plugin目录下面建立和钩子一样的文件夹 /App/Home/Plugin/register 下面建立和钩子名一样的文件register.php,写一个简单的类,名称也叫register,下面有个两个方法,一个叫before一个叫after:

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

然后在项目的公共配置中注册两个钩子:

/App/Conf/Hook.php

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

那么当我们访问Home下面Index控制器的Register方法时就会显示:

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

那么具体的原理究竟是怎么实现的呢?首先大家先来简单的了解一下我的这个框架,在Cute核心类中有个一个Start方法,用于加载路由启动框架,并且在加载控制器之前就先把/App/Conf/Hook.php文件加载进来:

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

那么在这个文件中,我们的代码是这样的:

PHP开发:架构师30秒轻松解析在PHP中如何实现Hook机制

大家想一下我们Hook的add方法,是把register这个钩子(类)实例化保存到Hooks这个私有数组中,这一步是在listen方法之前,那么我们再用listen方法去监听这个插件,发现存在,就执行一下这个对象的方法,也就实现了钩子的功能。


分享到这里就结束了,其中有千万个草泥马,只能说客户难以处理,不过不得以还是需要去解决,所以,希望对大家有所帮助, 能帮大家解决问题。

转载地址:http://qjfgx.baihongyu.com/

你可能感兴趣的文章
Fundebug前端JavaScript插件更新至1.6.0,新增test()方法用于测试
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
复杂业务下,我们为何选择Akka作为异步通信框架?
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>