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

 更新时间:2023年01月13日 15:37:13   作者:梅坞茶坊  
对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下。 所谓Hook机制,是从Windows编程中流行开的一种技术

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

  • 但是到了后面,接口被刷,老板然你在注册登录前加个验证码
  • 然后没过多久,老板又说,当用户注册时,我们给用户的邮箱或者手机发一条欢迎短信或者邮件吧
  • 还没过上多久,老板说,当新注册时,我们给手机注册的发送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();

到此这篇关于php中关于hook钩子函数底层理解的文章就介绍到这了,更多相关php hook钩子内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php面向对象程序设计入门教程

    php面向对象程序设计入门教程

    这篇文章主要介绍了php面向对象程序设计,结合实例形式分析了PHP面向对象程序设计的基本概念、原理以及类的定义、对象实例化、构造方法等简单使用技巧,需要的朋友可以参考下
    2019-06-06
  • PHP中的日期和时间处理函数的使用详解

    PHP中的日期和时间处理函数的使用详解

    在 Web 开发中,处理日期和时间是一个常见的任务,PHP 提供了一系列强大的日期和时间处理函数,下面我们就来看看这些函数的用法和优势吧
    2023-08-08
  • PHP学习笔记之一

    PHP学习笔记之一

    本系列适合有其他编程语言经验而PHP经验为0的人快速参考入门。
    2011-01-01
  • PHP反射机制用法实例

    PHP反射机制用法实例

    这篇文章主要介绍了PHP反射机制用法,是PHP程序设计中比较重要的概念,需要的朋友可以参考下
    2014-08-08
  • PHP获取对象属性的三种方法实例分析

    PHP获取对象属性的三种方法实例分析

    这篇文章主要介绍了PHP获取对象属性的三种方法,结合实例形式分析了php面向对象程序设计中获取对象属性的常见操作技巧,需要的朋友可以参考下
    2019-01-01
  • php通过curl方式实现发送接收xml数据

    php通过curl方式实现发送接收xml数据

    这篇文章主要为大家详细介绍了php如何通过curl方式实现发送接收xml数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • PHP获取二叉树镜像的方法

    PHP获取二叉树镜像的方法

    这篇文章主要介绍了PHP获取二叉树镜像的方法,涉及php使用队列针对二叉树进行翻转的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • smarty实现多级分类的方法

    smarty实现多级分类的方法

    这篇文章主要介绍了smarty实现多级分类的方法,涉及循环读取的技巧,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法

    PHP提示Deprecated: mysql_connect(): The mysql extension is dep

    这篇文章主要介绍了PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法,是在进行PHP数据库程序开发中常会遇到的错误,需要的朋友可以参考下
    2014-08-08
  • PHP中使用addslashes函数转义的安全性原理分析

    PHP中使用addslashes函数转义的安全性原理分析

    这篇文章主要介绍了PHP中使用addslashes函数转义的安全性原理分析,较为深入的分析了addslashes函数的用法及ecshop自定义函数addslashes_deep的不足之处,非常具有实用价值,需要的朋友可以参考下
    2014-11-11

最新评论