币圈资讯

比特币以太坊等热点新闻资讯
首页 > 币圈资讯 > 正文内容

php框架中用到这种机制来扩展项目的基本思想

qer1232年前 (2023-12-10)币圈资讯869

hook_hook_hook

所谓Hook机制是编程中流行的一种技术。 主要思想是提前埋入(预设)一个可以添加功能的钩子。 这个钩子没有实际意义。 当我们需要在这个地方重新修改或者添加逻辑时,挂载扩展的类或者方法。 就到这一步吧。

hook插件机制的基本思想:

项目代码中,在你认为需要扩展(还没有扩展)的地方放置一个钩子函数。 当需要扩展时,将需要实现的类和函数挂载到这个钩子上,即可实现扩展。

这就是这个想法听起来相当普遍的原因。 我们来看一个在线实现示例。

整个插件机制包含三个部分:

1.Hook插件管理器类:这是核心文件,也是一个应用程序全局对象。它有三个主要职责

1>监听所有注册的插件并实例化这些插件对象。

2>注册所有插件。

3>当满足钩子条件时,触发相应的对象方法。

2、插件功能实现:这大部分是第三方开发者完成的,但是需要遵循我们的(管理器类定义)规则。 该规则是插件机制规定的,并且根据插件机制的不同而不同。

3、插件触发:即hook的触发条件。 这是一小段代码,您需要调用插件来触发此挂钩。

实施计划

第一个是插件管理器类。 此类应放置在全局引用中,并在需要插件时首先加载。

 '插件名称',
 # 'directory'=>'插件安装目录'
 #);
 $plugins = get_active_plugins();#这个函数请自行实现
 if($plugins)
 {
 foreach($plugins as $plugin)
 {//假定每个插件文件夹中包含一个actions.php文件,它是插件的具体实现
 if (@file_exists(STPATH .'plugins/'.$plugin['directory'].'/actions.php'))
 {
 include_once(STPATH .'plugins/'.$plugin['directory'].'/actions.php');
 $class = $plugin['name'].'_actions';
 if (class_exists($class))
 {
 //初始化所有插件
 new $class($this);
 }
 }
 }
 }
 #此处做些日志记录方面的东西
 }
 
 /**
 * 注册需要监听的插件方法(钩子)
 *
 * @param string $hook
 * @param object $reference
 * @param string $method
 */
 function register($hook, &$reference, $method)
 {
 //获取插件要实现的方法
 $key = get_class($reference).'->'.$method;
 //将插件的引用连同方法push进监听数组中
 $this->_listeners[$hook][$key] = array(&$reference, $method);
 #此处做些日志记录方面的东西
 }
 /**
 * 触发一个钩子
 *
 * @param string $hook 钩子的名称
 * @param mixed $data 钩子的入参
 * @return mixed
 */
 function trigger($hook, $data='')
 {
 $result = '';
 //查看要实现的钩子,是否在监听数组之中
 if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0)
 {
 // 循环调用开始
 foreach ($this->_listeners[$hook] as $listener)
 {
 // 取出插件对象的引用和方法
 $class =& $listener[0];
 $method = $listener[1];
 if(method_exists($class,$method))
 {
 // 动态调用插件的方法
 $result .= $class->$method($data);
 }
 }
 }
 #此处做些日志记录方面的东西
 return $result;
 }
}

接下来是一个简单插件的实现。 这是一个简单的Hello World插件,用于输出句子。 实际情况中可能包括对数据库的操作或者其他一些具体的逻辑。

register('demo', $this, 'say_hello');
 }
 
 function say_hello()
 {
 echo 'Hello World';
 }
}

下一步是触发插件调用的地方。 例如,如果我想将Index.php放在我的博客主页上,那么你在index.php中的某处编写:

$pluginManager->trigger('demo','');

第一个参数代表钩子的名称,第二个参数是插件对应方法的入口参数。 由于本例中没有输入参数,因此为空。

这样的例子基本上清晰地表达了“hook”插件机制的实现方法和逻辑。

以上就是本文的全部内容。 希望对大家的学习有所帮助。 也希望大家支持PHP自学中心。

谢谢阅读!

扫描二维码推送至手机访问。

版权声明:本文由本站发布,如需转载请注明出处。

转载请注明出处https://web-based-papers.com/post/229.html

标签: hook
分享给朋友:

相关文章

前OKexCEO李书沸加入火币担任集团董事会秘书兼国际商务拓展副总裁

前OKexCEO李书沸加入火币担任集团董事会秘书兼国际商务拓展副总裁

在李林宣布李书飞加入火币后,OKex明星徐某在微信朋友圈发文称,李书飞突然辞职,自己事先并不知情。 “来问我具体情况的人太多了,我不得不回应一下:5月14日上午,我收到李书飞先生辞职的消息,事前没有...

芝麻交易所okEx币如何购买?用哪一个币种最靠谱?

芝麻交易所okEx币如何购买?用哪一个币种最靠谱?

欧仪最新版本 欧易APP最新版本是一个安全、稳定、可靠的数字货币交易平台。 APP下载官网地址 下载成为新用户,前3天独享**30%年化收益 如今,币圈最流行的数字货币是狗狗币和柴币币。 Shib...

币印矿池联合创始人朱砝:决战丰水期,矿“机”何去何从?

币印矿池联合创始人朱砝:决战丰水期,矿“机”何去何从?

《七姐观察》专栏·第六部分 全文7926字 | 15 分钟阅读 介绍: 朱伟,比音矿池联合创始人,拥有多年互联网产品设计经验。 连续创业者,曾是比特大陆矿池创始团队成员。 区块链七姐,知名比特币区...

Pi币加入币联盟群,一个非盈利的社区分享平台

Pi币加入币联盟群,一个非盈利的社区分享平台

Pi 联合创始人兼社区领袖 @vince 拥有耶鲁大学政治学学位和斯坦福大学商业学位。 从 vince 的聊天中得知: 1、pi币将采用的ERC20标准; ERC20标准是什么? 据相关数据显示,目...

虚拟币PTC国际通用诈骗案7人获刑十二年半

虚拟币PTC国际通用诈骗案7人获刑十二年半

虚假虚拟平台非法运营 涉案金额达940万元以上 2020年3月至2020年12月,胡某、杨某贤等人利用注册的成都嘉榕腾软件信息技术有限公司(以下简称嘉榕腾公司)非法经营“盛大合约”虚假虚拟货币。 该投...

2023年7月莱特币价格将飙升至200%,创历史新高

2023年7月莱特币价格将飙升至200%,创历史新高

莱特币触底了吗? 自2011年10月推出以来,莱特币经历了两次减半。 第一次是在 2015 年 8 月,当时区块奖励从 50 LTC 减少到 25 LTC。 第二次发生在 2019 年 8 月,将...

加入欧意,探索元宇宙世界!

探索DeFi,DApps, NFTs 和GameFi的世界,和OKX一起创造未来!