币圈资讯

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

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

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

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
分享给朋友:

相关文章

RDNTRDNT主打借贷的全链货币市场是什么?

RDNTRDNT主打借贷的全链货币市场是什么?

RDNT专注于全链条借贷货币市场。 它是 Arb 上原生的借贷市场项目,绝对是 arb 主导借贷的底层跨链协议。 它通过全链和跨链借贷提高了 DeFi 资产利用效率。 1.坎昆升级的好处。 2、背靠...

以太坊今日价格历史价格未来价格分析专题

可供众多xnb使用的ETH的价格会受到多种因素的影响。 以太坊有可能上涨吗? eth 以太坊今天价格? 以太坊今日价格、历史价格、未来价格分析,专题币圈为您免费提供以太坊价格相关新闻、知识相关报告等...

美服将在12月8日进行11.24版本更新

美服将在12月8日进行11.24版本更新

如果不出意外,终极皮肤回归活动也将于本月开启(2020年和2021年活动的高级皮肤将参加回归活动)。 所以,如果你错过了自己喜欢的终极皮肤,可以趁这个机会兑换一下。 如果您没有足够的声望点来解锁声望皮...

氮化钛(TiN)薄膜的硬掩膜可扩展性挑战

\r\n 随着芯片设计的发展,芯片特征尺寸变得更小,纵横比变得更高,封装变得更密集,以生产先进的集成电路。 因此,在创建电路(或互连)时,用于定义蚀刻和金属化图案的材料对于保持这些图案的完整性极其重要...

秦宇子全新《LUNA》钢琴版MV煽情来袭仙气十足

太合音乐集团“年度女声”歌手秦雨子继《LUNA》正式版MV之后,又带来了轰动一时的全新《LUNA》钢琴版MV。 与正式版MV中童话般的光影美学不同,钢琴版MV中,秦雨子化身为纯爱少女,独自弹奏钢琴,轻...

美图终止BEC-20海外推广合作腾讯区块链技术专家屠海涛

美图终止BEC-20海外推广合作腾讯区块链技术专家屠海涛

原因是当日13:00左右,BEC出现异常交易。 半小时内,BEC价格从0.32美元暴跌至0.024美元,暴跌92.5%。 随后,该币直接被下架。 此外,美图今日宣布,即日起,公司海外产品将终止与美图...

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

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