php中钩子hook的实现原理

举报
lxw1844912514 发表于 2022/03/26 23:26:54 2022/03/26
【摘要】 钩子定义 钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以减少很多工作量)。 钩子作用 钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处...
钩子定义

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

钩子作用

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

钩子实现

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


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


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

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/119905002

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。