php中的钩子理解及应用实例分析


Posted in PHP onAugust 30, 2019

本文实例讲述了php中的钩子理解及应用。分享给大家供大家参考,具体如下:

钩子的解释

钩子定义

钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以减少很多工作量)。
可以理解为当一个玻璃球从空中落下,即将砸到人的时候,有个事件会提前发生.例如告诉那个被砸的人,球已经在下落过程中,
告诉就是一个事件,一个钩子,我们可以针对不同的人做出不同的相应,如果是男人我们告诉他这个球砸到人不疼,如果是女人则告诉她很疼;

钩子作用

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

钩子实现

/*钩子的完整实现应该叫事件驱动。事件驱动分为两个阶段,第一个阶段是注册事件,目的是给未来可能发生的“事件”起一个名字,简单的实现方法是
用单例模式产生一个持久的对象或者注册一个全局变量,然后将事件名称,以及该事件对应的类与方法插入全局变量即可。也就是挂载一个钩子。
第二个阶段是触发事件,本质上就是在事件的全局变量中查询要触发的事件名称,然后找到注册好的类与方法,实例化并运行。这样子就可以摆
脱传统方式中程序必须按顺序的规则,进一步实现解除耦合的目的。
*/

代码示例一

class Ball{
 public function down(){
 echo  "ball is downing ";
 //注册事件
 Hook::add("man");
 Hook::add("Women");
 }
 public function do(){
 Hook::exec();
 }
}
// 钩子的定义
class Hook{
 private $hooklist = null ;
 // 添加
 public function add($people){
 $this->hooklist[] = new $people();
 }
 // 触发事件
 public function exec(){
 foreach($this->hooklist as $people){
   $addon ->act();
 }
 }
}
// 钩子实现
class man(){
 public function act(){
 echo 'notiong';
 }
}
class WoMan(){
 public function act(){
 echo 'oh my god ';
 }
}
class child(){
 public function act(){
 echo 'oh my god ';
 }
}
$ball = new Ball();
$ball ->down();
$ball ->do();

代码示例二

// 如果需要添加小孩,就可以做添加一个小孩Hook::add("child");
 /*=========================钩子的升级版============================================/*
class Hook{
  private $hookList;
  //添加
 function add($name,$fun){
 $this->hookList[$name][] = $fun;
 }
function excec($name){
  $value = func_get_args();
  unset($value[0]);
  foreach ($this->hookList[$name] as $key => $fun) {
    call_user_func_array($fun, $value);
  }
}
}
$hook = new Hook();
$hook->add('women',function($msg){
 echo 'oh my god'.$msg ;
})
$hook->add('man',function($msg){
 echo 'nothing'.$msg ;
})
// 执行
$hook->excec('man','taoge');
$hook->excec('women','xxx');

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
pw的一个放后门的方法分析
Oct 08 PHP
PHP中ADODB类详解
Mar 25 PHP
php flush类输出缓冲剖析
Oct 19 PHP
PHP 简单数组排序实现代码
Aug 05 PHP
建站常用13种PHP开源CMS比较
Aug 23 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
PHP序列化操作方法分析
Sep 28 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
Yii框架分页技术实例分析
Aug 30 #PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 #PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 #PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 #PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 #PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 #PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 #PHP
You might like
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
js loading加载效果实现代码
2009/11/24 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
[06:01]刀塔次级联赛top10第一期
2014/11/07 DOTA
Python实现简单的四则运算计算器
2016/11/02 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
python3 求约数的实例
2019/12/05 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
HTML5 Canvas概述
2009/08/26 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
大学生军训自我鉴定
2014/02/12 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
秋菊打官司观后感
2015/06/03 职场文书
公司仓库管理制度
2015/08/04 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers