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 相关文章推荐
PHP5中新增stdClass 内部保留类
Jun 13 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
php函数连续调用实例分析
Jul 30 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
php输出反斜杠的实例方法
Sep 19 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
Sep 30 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
Oct 15 PHP
PHP标准库 (SPL)――Countable用法示例
Jun 05 PHP
如何利用PHP实现上传图片功能详解
Sep 24 PHP
PHP7新增函数
Mar 09 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
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
php长字符串定义方法
2012/07/12 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
学习ExtJS 访问容器对象
2009/10/07 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
毕业生求职推荐信
2013/11/04 职场文书
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
考博导师推荐信范文
2015/03/27 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
Java spring单点登录系统
2021/09/04 Java/Android
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记