本文共 1382 字,大约阅读时间需要 4 分钟。
所谓Hook机制,是从Windows编程中流行开的一种技术。今天就教大家这么一个技术点,希望对那些有帮助的人有所帮助;
在给大家分享之前,这里推荐下我自己建的PHP开发-VIP资料出售平台 :638965404,不管你是小白还是大牛,我都挺欢迎,不定期分享干货,包括2017最新的PHP企业案例学习资料和零基础入门教程,以及面试宝典,欢迎初学和进阶中的小伙伴,大家一起交流学习,共同进步
所谓Hook机制,其主要思想是提前在可能增加功能的地方埋好(预设)一个钩子,这个钩子并没有实际的意义,当我们需要重新修改或者增加这个地方的逻辑的时候,把扩展的类或者方法挂载到这个点即可。
举个简单的例子,我们现在要写一个用户注册的功能,如下图:
/App/Home/Controller/IndexController.class.php
突然有一天,客户说我需要增加一个功能,新用户注册奖励50积分,那我只好这样写:
客户看了很满意,但是你的另一个同事需要你的代码,你跟他说自己从git上pull。客户又提出一个要求,要在用户注册后给用户发一个邮件(忍住(╬▔皿▔)),那你会这样做:
如果在一个项目中,有大量的类似修改,你该怎么办?就那么修改?项目只会越来越臃肿,越发的杂乱不堪。捅死客户?别闹了,犯法的ㄟ( ▔, ▔ )ㄏ。辞职?想想房贷,再想想妻儿老小,我忍(。・`ω´・)。ps:程序员哪来的妻儿...( ̄∀ ̄)
言归正传,最好解决办法就是使用钩子机制。
首先来看一下我们写的Hook类:
/CutePHP/Lib/Cute/Hook.class.php
这是我仿照TP的Hook写的一个简单的Hook类,该类中包含了一个静态的私有属性Hooks用于记录所有已经注册的钩子
add方法传入钩子的名称和方法,即可将这个钩子存入数组中,listen则是用于监听某个钩子,只要有这个钩子将调用exec方法执行这个钩子
我们来测试一下,首先在/App/Home/Controller.class.php中埋入钩子:
然后在/App/Home/Plugin目录下面建立和钩子一样的文件夹 /App/Home/Plugin/register 下面建立和钩子名一样的文件register.php,写一个简单的类,名称也叫register,下面有个两个方法,一个叫before一个叫after:
然后在项目的公共配置中注册两个钩子:
/App/Conf/Hook.php
那么当我们访问Home下面Index控制器的Register方法时就会显示:
那么具体的原理究竟是怎么实现的呢?首先大家先来简单的了解一下我的这个框架,在Cute核心类中有个一个Start方法,用于加载路由启动框架,并且在加载控制器之前就先把/App/Conf/Hook.php文件加载进来:
那么在这个文件中,我们的代码是这样的:
大家想一下我们Hook的add方法,是把register这个钩子(类)实例化保存到Hooks这个私有数组中,这一步是在listen方法之前,那么我们再用listen方法去监听这个插件,发现存在,就执行一下这个对象的方法,也就实现了钩子的功能。
分享到这里就结束了,其中有千万个草泥马,只能说客户难以处理,不过不得以还是需要去解决,所以,希望对大家有所帮助, 能帮大家解决问题。
转载地址:http://qjfgx.baihongyu.com/