网站首页 > 基础教程 正文
钩子的解释
钩子定义
钩子是编程里一个常见概念, 非常的重要。它使得系统变得非常容易拓展, (而不用理解其内部的实现机理, 这样可以减少很多工作量)。
可以理解为当一个玻璃球从空中落下,即将砸到人的时候,有个事件会提前发生.例如告诉那个被砸的人,球已经在下落过程中,
告诉就是一个事件,一个钩子,我们可以针对不同的人做出不同的相应,如果是男人我们告诉他这个球砸到人不疼,如果是女人则告诉她很疼;
钩子作用
钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出, 在没有到达目的窗口前, 钩子程序就先捕获该消息, 亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息, 也可以不作处理而继续传递该消息, 还可以强制结束消息的传递。
钩子实现
钩子的完整实现应该叫事件驱动。事件驱动分为两个阶段, 第一个阶段是注册事件, 目的是给未来可能发生的"事件"起一个名字, 简单的实现方法是
用单例模式产生一个持久的对象或者注册一个全局变量, 然后将事件名称, 以及该事件对应的类与方法插入全局变量即可。也就是挂载一个钩子。
第二个阶段是触发事件, 本质上就是在事件的全局变量中查询要触发的事件名称, 然后找到注册好的类与方法, 实例化并运行。
这样子就可以摆脱传统方式中程序必须按顺序的规则, 进一步实现解除耦合的目的。
<?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();
?>
钩子的升级版
<?php
// 如果需要添加小孩,就可以做添加一个小孩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');
?>
猜你喜欢
- 2024-10-12 六种流行语言(C、C++、Python、JavaScript、PHP、Java)对比
- 2024-10-12 「讨论」php与Python之间有何区别?Python和php之间的简单比较
- 2024-10-12 PHP获取目录中的全部内容 php获取目录列表
- 2024-10-12 重蔚自留地php学习第三十天——php数组
- 2024-10-12 脚把脚教你消息队列,典型的应用场景到底有哪些?
- 2024-10-12 php-生成器(yield) php生成html
- 2024-10-12 PHP——数组根据某一键值合并 php 数组 合并
- 2024-10-12 php 一步步实现mvc架构——view篇
- 2024-10-12 PHP函数shuffle()取数组若干个随机元素的方法及实例分析
- 2024-10-12 WordPress 主循环和全局变量 wordpress主题
- 最近发表
-
- 1G内存如何对40亿QQ号去重?(qq内存50g)
- Python的os模块:操作系统交互的得力助手
- 引爆你的效率!深入探索 Python os 模块那些不为人知的高阶玩法
- python 进阶突破——内置模块(Standard Library)
- 10行Python代码实现智能文件整理(python整理文件到指定文件夹)
- Python办公自动化系列篇之六:文件系统与操作系统任务
- Windows如何批量修改文件后缀名(电脑如何批量修改文件后缀名)
- Python常用内置模块介绍——文件与系统操作详解
- 每天一个Python库:标准库 os 模块,玩转文件和目录操作!
- Python目录与文件操作教程(python编程目录)
- 标签列表
-
- 菜鸟教程 (58)
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- pythonif (68)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)