假设你有一套登录注册业务。一开始很简单,老板说只需要常规的注册登录就行。
等等,在业务中,我们对一个需求,会遇到各种变更,如果我们不使用 Hook ,就需要去频繁的改动主业务代码,而且还很容易出错,如果像这个情况,我们在一开始在代码中埋下以下 Hook:
那么我们只需要去处理这些 Hook 就行,丝毫不用去改动原本的代码,而且,如果我们有一天不需要某个功能,直接删除那个功能的模块代码就行。整个流程,我们的核心功能代码都没有发生过变动,如果其中一个无法使用,那我们停用掉那一个就好。
ThinkPHP的核心就是 Hook。Discuz 插件、WordPress 插件、Emlog 插件 核心都是 Hook。
举个例子:
钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以减少很多工作量)。
钩子作用
钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
钩子实现
钩子的完整实现应该叫事件驱动。事件驱动分为两个阶段,第一个阶段是注册事件,目的是给未来可能发生的“事件”起一个名字,简单的实现方法是用单例模式产生一个持久的对象或者注册一个全局变量,然后将事件名称,以及该事件对应的类与方法插入全局变量即可。也就是挂载一个钩子。
第二个阶段是触发事件,本质上就是在事件的全局变量中查询要触发的事件名称,然后找到注册好的类与方法,实例化并运行。这样子就可以摆脱传统方式中程序必须按顺序的规则,进一步实现解除耦合的目的。
- <?php
- /**
- * 定义钩子
- */
- class Hook
- {
- private $hooklist = null;
- //添加
- public function add($people)
- {
- $this->hooklist[] = new $people;
- }
- //触发事件
- public function exec()
- {
- foreach ($this->hooklist as $people)
- {
- $people->act();
- }
- }
- }
- /** 钩子实现
- */
- class man
- {
- public function act()
- {
- echo 'this is man <br>';
- }
- }
- class WoMen
- {
- public function act()
- {
- echo 'this is women <br>';
- }
- }
- class child
- {
- public function act()
- {
- echo 'this is a child <br>';
- }
- }
- /**注册事件
- */
- class Ball
- {
- public function __construct()
- {
- $this->hook=new Hook();
- }
- public function down()
- {
- echo 'ball is downing <br>';
- //添加,去掉钩子
- $this->hook->add('man');
- //$this->hook->add('woMen');
- $this->hook->add('child');
- }
- public function dothing()
- {
- $this->hook->exec();
- }
- }
- $ball = new Ball();
- $ball->down();
- $ball->dothing();
以上就是php中关于hook钩子函数底层理解的详细内容,更多关于php中关于hook钩子函数底层理解的资料请关注九品源码其它相关文章!