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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • larave5.6 引入自定义函数库时,报错不能重复定义

    larave5.6 引入自定义函数库时,报错不能重复定义

    2021年11月5日
    39
  • 轻松实现在web页面中直接播放rtsp视频流「建议收藏」

    轻松实现在web页面中直接播放rtsp视频流「建议收藏」帮你轻松实现在页面中直接播放rtsp视频流使用准备ffmpeg运行rtsp2web前端代码课外知识写在前面我之前研究在web中直接播放rtsp视频流时,写过一篇文章:【前端】rtsp与rtmp视频流的播放方法。阅读这篇文章对你的学习有很大帮助。在文章中我有过详细的分析和解读,给出了结论:要想在web中实时播放rtsp视频流:借助后端转码推流将是必要的操作。实现我用node.js实现了转码推流的功能,并将其打包成rtsp2web发布到了npm上。……

    2022年10月10日
    0
  • toast弹窗教程_toast提示是什么

    toast弹窗教程_toast提示是什么2.3.1 反编译APK安装包首先,需要从网上下载样本安装包,这里使用的样本是哒哒文件助手,读者可以从安卓市场下载。在反编译APK之前,还需要从网上下载第三方模拟器,如夜神、雷电等模拟器。安装下载好的样本,运行看一下效果,大概了解一下该APK实现的相关功能,如图2.6所示,该界面就是程序入口界面。                   图2.6…

    2022年9月15日
    0
  • Java并发面试_常见面试题

    Java并发面试_常见面试题预览并发问题详解请谈谈你对volatile的理解linkCAS你知道吗?link原子类Atomiclntegerl的ABA问题谈谈?原子更新引用知道吗?link我们知道ArrayList是线程不安全,请编码写一个不安全的案例并给出解决方案link公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁linkCountDownLatch/CyclicBarrier/Semaphore使用过吗?link阻塞队列知道吗?l

    2022年10月8日
    0
  • pycharm怎么设置代码补全_vs2010代码自动补全

    pycharm怎么设置代码补全_vs2010代码自动补全代码补全功能在PyCharm上是一流的。默认情况下PyCharm会在你输入的时候给出建议:由于此功能可有点耗电,你可以通过选择File→PowerSaveMode来禁用它。您仍然可以通过Control-Space显式使用这一功能。…

    2022年8月28日
    2
  • activiti工作流开发_flowable工作流

    activiti工作流开发_flowable工作流深入理解Activiti工作流Activiti作为一个流行的开源工作流引擎,正在不断发展,其6.0版本以API形式提供服务,而之前版本基本都是要求我们的应用以JDK方式与其交互,只能将其携带到我们的应用中,而API方式则可以服务器独立运行方式,能够形成一个专网内工作流引擎资源共享的方式。Activiti执行的BPMN2.0,这个规范中有几个要素见下图:其实最经常使用的是开始结束事件和任务,本文就以…

    2022年10月6日
    0

发表回复

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

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