币圈资讯

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

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

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

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

相关文章

美国司法部查获36亿美元比特币价值约合229亿元

美国司法部查获36亿美元比特币价值约合229亿元

警方缴获了超过 94,000 枚比特币。 按最新交易价格计算,这些比特币的价值高达约36亿美元,约合人民币229亿元。 据悉,这是美国司法部历史上涉及金额最大的追回行动。 美国副司法部长丽莎·莫纳科...

Heron-011治疗患者术后头24小时不需要鸦片急救药物

首席执行官 Quart 表示:“我们现在将把注意力转向开展一项基础广泛的开发计划,这将使我们能够将 HTX-011 带给许多接受多种不同手术、经历严重手术疼痛的患者。” 在这项研究中,64 名接受囊切...

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

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

唯一艺术敦煌合成规则敦煌艺术系列NFT亮相敦煌美术院

4、强大的技术支持 该平台基于区块链技术在知识产权领域的应用。 强大的加密算法和云计算能力支撑每一次安全可靠的链上交互。 【唯一艺术敦煌合成规则】 敦煌艺术系列动态NFT以系统化的内容、动静结合的形式...

莱特币减半结束后还会大涨吗?还会涨吗?

莱特币减半结束后还会大涨吗?还会涨吗?

减半后莱特币还会继续暴涨吗? 减半后莱特币肯定会上涨,但能否大幅上涨还很难说。 莱特币减半对于这个币种确实是一个提振,包括莱特币的历史周期。 因为像比特币一样,遇到减半周期会有不错的上涨。 但今年是...

微信支付和支付宝四年过去未如预期那般引起轰动

微信支付和支付宝四年过去未如预期那般引起轰动

一、根本性的变化和挑战 数字人民币的出现是金融科技发展的必然结果。 在微信支付和支付宝主导的市场中,数字人民币以其国家级的权威性和安全性展现出不同的优势。 它不仅消除了在线支付的需要,还消除了一些传...

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

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