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();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111459.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【Jqurey EasyUI+Asp.net】—DataGrid增加、删、更改、搜

    【Jqurey EasyUI+Asp.net】—DataGrid增加、删、更改、搜

  • 小程序 轮播图

    小程序 轮播图轮播图:cssswiper{height:400rpx;}swiper-itemimage{width:100%;height:100%;}.swiper-container{position:relative;margin-top:-300rpx;}.swiper-container.swiper{height:300r…

  • rocketmq原理与实战解析_rocketmq底层原理

    rocketmq原理与实战解析_rocketmq底层原理broker1.broker的启动brker的启动Broker向namesrv注册Topic在broker文件上的存储json格式Namesrv接收Broker注册的topic信息,na

  • Matlabinf_matlab怎么定义函数

    Matlabinf_matlab怎么定义函数函数功能在图像处理中,该函数用于获取一张图片的具体信息。这些具体信息包括图片的格式、尺寸、颜色数量、修改时间等等。在matlab的命令窗口中键入docimfinfo或者helpimfinfo都可以得到该函数的帮助信息。调用方式info=imfinfo(filename,fmt)info=imfinfo(filename)程序示例  下面这个程序用于获取位图相关信息。该函数获取位图文件头信…

  • 简述django请求生命周期_django更新数据库记录

    简述django请求生命周期_django更新数据库记录Django请求生命周期分析1.客户端发送请求在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都

  • 数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?「建议收藏」

    数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?「建议收藏」先说结论比较次数与序列初态无关的算法是:二路归并排序、简单选择排序、基数排序比较次数与序列初态有关的算法是:快速排序、直接插入排序、冒泡排序、堆排序、希尔排序排序趟数与序列初态无关的算法是:直接插入排序、折半插入排序、希尔排序、简单选择排序、归并排序、基数排序排序趟数与序列初态有关的算法是:冒泡排序、快速排序关于排序趟数插入排序、选择排序趟数都是固定的n-1。对于插入排序来说或,即使序列有序,也要依次从第二个元素开始,向前找它的插入位置。冒泡排序趟数与数据有关,优

发表回复

您的电子邮箱地址不会被公开。

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