How does PHP implement the Hook mechanism? This article mainly introduces how to implement the Hook mechanism in PHP, and introduces the principle and implementation process of the Hook mechanism in detail. It has certain reference value, and those who are interested can learn about it. I hope to be helpful.
I’m actually not familiar with the concept of “hook”. I recently saw this mechanism used in a PHP framework to expand projects, so I’ll give it a try.
The so-called Hook mechanism is a technology popular in Windows programming. The main idea is to bury (preset) a hook in advance where functionality may be added. This hook has no practical significance. When we need to re-modify or add logic in this place, mount the extended class or method. Just get to this point.
The basic idea of the hook plug-in mechanism:
In the project code, place a hook function in the place where you think you want to expand (not expand it yet), and wait for the expansion that needs to be done. At this time, you can mount the classes and functions that need to be implemented on this hook to achieve expansion.
The idea sounds so general, let’s look at an online implementation example.
The entire plug-in mechanism consists of three parts:
1.hook plug-in manager class: This is the core file and is an application global Global object. It has three main responsibilities
1>Listen to all registered plug-ins and instantiate these plug-in objects.
2>Register all plug-ins.
3>When the hook condition is met, the corresponding object method is triggered.
2. Plug-in function implementation: This is mostly done by third-party developers, but it needs to follow our (manager class definition) rules. This rule is stipulated by the plug-in mechanism and varies depending on the plug-in mechanism. .
3. Plug-in triggering: that is, the triggering condition of the hook. This is a small piece of code placed where you need to call the plugin to trigger this hook.
----------------------------------Look at other people’s solutions--- --------------------------
The first is the plug-in manager class PluginManager. This class should be placed in the global reference. , where the plug-in is needed, it will be loaded first.
'插件名称', # '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; } }
The next step is the implementation of DEMO_actions, a simple plug-in. This is a simple Hello World plug-in for outputting a sentence. In actual situations, say_hello may include operations on the database or some other specific logic.
register('demo', $this, 'say_hello'); } function say_hello() { echo 'Hello World'; } }
The next step is where the plug-in call is triggered. For example, if I want to put say_hello on the homepage of my blog, Index.php, then you write somewhere in index.php:
$pluginManager->trigger('demo','');
The first parameter represents the name of the hook, and the second parameter is the entry parameter of the corresponding method of the plug-in. Since there are no input parameters in this example, it is empty.
Such an example basically clearly expresses the implementation method and logic of the "hook" plug-in mechanism.
Related recommendations:
Detailed explanation of PHP high-precision operation BC function library
Detailed explanation of using PHP to find the longest common substring of two strings
Detailed explanation of PHP operating database based on ORM
The above is the detailed content of Detailed explanation of how PHP implements Hook mechanism. For more information, please follow other related articles on the PHP Chinese website!