php中钩子hook的实现原理

php中钩子hook的实现原理

大家好,又见面了,我是全栈君。

钩子定义

钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以减少很多工作量)。

钩子作用

钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

钩子实现

钩子的完整实现应该叫事件驱动。事件驱动分为两个阶段,第一个阶段是注册事件,目的是给未来可能发生的“事件”起一个名字,简单的实现方法是用单例模式产生一个持久的对象或者注册一个全局变量,然后将事件名称,以及该事件对应的类与方法插入全局变量即可。也就是挂载一个钩子。

第二个阶段是触发事件,本质上就是在事件的全局变量中查询要触发的事件名称,然后找到注册好的类与方法,实例化并运行。这样子就可以摆脱传统方式中程序必须按顺序的规则,进一步实现解除耦合的目的。

<?php

/**
 * 定义钩子
 * Date: 2021/8/25 9:50
 */
class Hook
{
    private $hooklist = null;

    //添加
    public function add($people)
    {
        $this->hooklist[] = new $people;
    }

    //触发事件
    public function exec()
    {
        foreach ($this->hooklist as $people)
        {
            $people->act();
        }
    }
}

/** 钩子实现
 * Date: 2021/8/25 9:55
 */
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>';
    }
}

/**注册事件
 * Date: 2021/8/25 9:56
 */
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://javaforall.net/111459.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • siamfc++代码_asic芯片设计

    siamfc++代码_asic芯片设计SiamFC论文解读及代码实现摘要:传统上,任意目标跟踪的问题是通过专门在线学习目标外观的模型来解决的,使用视频本身作为唯一的训练数据。尽管这些方法取得了成功,但他们的纯在线方法固有地限制了他们可以学习的模型的丰富性。最近,有人试图利用深层卷积网络的表达能力。然而,当要跟踪的目标事先未知时,需要在线执行随机梯度下降以适应网络的权重,这严重影响了系统的速度。在本文中,我们在ILSVRC15数据集上为视频中的目标检测配备了一个基本的跟踪算法和一个新的端到端训练的孪生神经网络。我们的跟踪器以超过实时的帧速率运

    2022年10月1日
    0
  • linux必须运行在enforcing,Linux(入门基础):97—SELinux三种模式的启动、关闭、查看(getenforce、setenforce、sestatus、restorecon)…

    linux必须运行在enforcing,Linux(入门基础):97—SELinux三种模式的启动、关闭、查看(getenforce、setenforce、sestatus、restorecon)…一、SELinux三种模式简介Enforcing:强制模式。代表SELinux在运行中,且已经开始限制domain/type之间的验证关系Permissive:宽容模式。代表SELinux在运行中,不过不会限制domain/type之间的验证关系,即使验证不正确,进程仍可以对文件进行操作。不过如果验证不正确会发出警告Disabled:关闭模式。SELinux并没有实际运行二、getenforce命…

    2022年6月27日
    37
  • oracle11g安装完成如何打开界面

    oracle11g安装完成如何打开界面找到oracle11g的安装路径下的tnsnames.ora复制该文件到下面对应的文件替换即可(该文件(压缩包名instantclient_11_2可以自己下载,也可以向我要qq1406697403,下载后任意建一个文件夹如本文oracle11,将该压缩包解压后放到其中)然后做替换(看图)准备好plsql打开如下设置如:现在可以登录了!

    2022年7月25日
    74
  • 视频试看5分钟[通俗易懂]

    缺陷:用户在控制台能直接拿到视频url地址<!DOCTYPEhtml><html><head><title></title></head><styletype=”text/css”>.videobox{position:relative;width:300px;…

    2022年4月6日
    50
  • 字符串有哪些_vue子组件emit方法失效

    字符串有哪些_vue子组件emit方法失效ES2017引入了字符串补全长度的函数。如果某个字符串的长度不够指定的长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。’a’.padStart(3,’0′)//’00a’ ‘x’.padEnd(5,’ab’)//’xabab’ ‘x’.padEnd(4,’ab’)//’xaba’上面代码中,padStart()和padSt…

    2025年10月16日
    1
  • 用python画出爱心_Python编出爱心

    用python画出爱心_Python编出爱心Python中可以使用turtle库来画图,通过控制画笔运动来实现在画布上画图案。使用Python画爱心代码如下:#!/usr/bin/envpython#-*-coding:utf-8-*-importturtleimporttime#画心形圆弧defhart_arc():foriinrange(200):turtle.right(1)turtle.forward(2)de…

    2025年9月26日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号