php中关于hook钩子函数底层理解

作者:梅坞茶坊 时间:2023-06-12 06:49:55 

假设你有一套登录注册业务。一开始很简单,老板说只需要常规的注册登录就行。

  • 但是到了后面,接口被刷,老板然你在注册登录前加个验证码

  • 然后没过多久,老板又说,当用户注册时,我们给用户的邮箱或者手机发一条欢迎短信或者邮件吧

  • 还没过上多久,老板说,当新注册时,我们给手机注册的发送200金币,给邮箱注册的发送100金币,作为注册奖励。

  • 接着没过多久,老板说,如果一个用户超过1个月没登录的话,再次登录时,你给就给他账户发送100金币作为回归奖励,

  • 结果过了不久,老板又说,注册时判断一下他是手机号注册还是邮箱注册,如果是邮箱就跳转 A 页面,如果是手机号就跳转 B 页面

  • 过了一段时间,老板又说,我觉得第二个 idea 不好,我们给他去掉吧。

  • 。。。。

等等,在业务中,我们对一个需求,会遇到各种变更,如果我们不使用 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();

来源:https://blog.csdn.net/qq_32421489/article/details/128655989

标签:php,hook,钩子
0
投稿

猜你喜欢

  • ASP Recordset 分页显示数据的方法(修正版)

    2011-04-10 10:42:00
  • python next()和iter()函数原理解析

    2023-04-05 21:58:50
  • pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解

    2023-12-04 02:47:49
  • Python venv虚拟环境配置过程解析

    2021-11-30 20:21:48
  • python线程join方法原理解析

    2021-02-02 04:49:01
  • 谈PHP生成静态页面分析 模板+缓存+写文件

    2023-11-14 12:44:39
  • Python基于ssh远程连接Mysql数据库操作

    2024-01-19 15:02:16
  • python之pkl文件的用法及说明

    2021-02-21 21:44:57
  • YOLOV5代码详解之损失函数的计算

    2022-06-09 02:01:58
  • ASP 使用Filter函数来检索数组

    2011-04-30 16:49:00
  • 使用C#连接并读取MongoDB数据库

    2024-01-15 17:12:13
  • 在python image 中安装中文字体的实现方法

    2021-08-06 06:19:35
  • 中文段首不需要空两格

    2010-04-23 20:31:00
  • SQL Server Parameter Sniffing及其改进方法

    2024-01-28 02:56:30
  • python使用mailbox打印电子邮件的方法

    2023-09-05 10:15:30
  • 对python中两种列表元素去重函数性能的比较方法

    2021-04-01 13:37:59
  • Python实现查询剪贴板自动匹配信息的思路详解

    2022-09-16 06:35:41
  • Python 6种基本变量操作技巧总结

    2023-04-03 21:50:04
  • js 模拟实现类似c#下的hashtable的简单功能代码

    2024-04-19 09:44:51
  • 详解如何使用Python网络爬虫获取招聘信息

    2021-09-28 06:58:17
  • asp之家 网络编程 m.aspxhome.com