Maison >développement back-end >tutoriel php >Comment implémenter le mécanisme Hook en PHP

Comment implémenter le mécanisme Hook en PHP

墨辰丷
墨辰丷original
2018-05-17 11:45:203896parcourir

Cet article présente principalement comment implémenter le mécanisme Hook en PHP. Il présente en détail le principe et le processus d'implémentation du mécanisme Hook. Il a une certaine valeur de référence. Ceux qui sont intéressés peuvent en savoir plus sur

. "Hook" En fait, je ne connais pas ce concept. J'ai récemment vu ce mécanisme être utilisé dans un framework PHP pour étendre des projets, je vais donc l'essayer.

Le mécanisme dit Hook est une technologie populaire dans la programmation Windows. L'idée principale est d'enterrer (par défaut) un hook à l'avance où des fonctions peuvent être ajoutées. Ce hook n'a aucune signification pratique. Lorsque nous devons re-modifier ou ajouter la logique de cet endroit, montez simplement la classe ou la méthode étendue. à ce point.

L'idée de base du mécanisme de plug-in hook :

Dans le code du projet, placez une fonction hook là où vous pensez qu'elle sera développée (non développée encore), et attendez l'expansion. À ce stade, vous pouvez monter les classes et les fonctions qui doivent être implémentées sur ce hook pour réaliser l'expansion.

Voici à quoi ressemble l’idée. Cela semble plutôt général. Jetons un coup d’œil à un exemple de mise en œuvre en ligne.

L'ensemble du mécanisme du plug-in se compose de trois parties :

1.hook classe de gestionnaire de plug-in : il s'agit du fichier principal et est un objet global global de l'application. . Il a trois responsabilités principales

1> Surveiller tous les plug-ins enregistrés et instancier ces objets plug-in.

2> Enregistrez tous les plug-ins.

3>Lorsque la condition de hook est remplie, la méthode objet correspondante est déclenchée.

2. Implémentation de la fonction du plug-in : cette opération est principalement effectuée par des développeurs tiers, mais elle doit suivre nos règles (définition de la classe du gestionnaire). Cette règle est stipulée par le mécanisme du plug-in et varie en fonction. sur le mécanisme de plug-in.

3. Déclenchement du plug-in : c'est-à-dire la condition de déclenchement du crochet. Il s'agit d'un petit morceau de code placé là où vous devez appeler le plugin pour déclencher ce hook.

----------------------------------Regardez les solutions des autres --- -- -------------------

La première est la classe du gestionnaire de plug-ins PluginManager. Cette classe doit être placée dans la référence globale. , là où le plug-in est nécessaire, il sera chargé en premier.

<?php
/**
*
* 插件机制的实现核心类

*/
class PluginManager
{
  /**
   * 监听已注册的插件
   *
   * @access private
   * @var array
   */
  private $_listeners = array();
   /**
   * 构造函数
   *
   * @access public
   * @return void
   */
  public function __construct()
  {
    #这里$plugin数组包含我们获取已经由用户激活的插件信息
   #为演示方便,我们假定$plugin中至少包含
   #$plugin = array(
    #  &#39;name&#39; => &#39;插件名称&#39;,
    #  &#39;directory&#39;=>&#39;插件安装目录&#39;
    #);
    $plugins = get_active_plugins();#这个函数请自行实现
    if($plugins)
    {
      foreach($plugins as $plugin)
      {//假定每个插件文件夹中包含一个actions.php文件,它是插件的具体实现
        if (@file_exists(STPATH .&#39;plugins/&#39;.$plugin[&#39;directory&#39;].&#39;/actions.php&#39;))
        {
          include_once(STPATH .&#39;plugins/&#39;.$plugin[&#39;directory&#39;].&#39;/actions.php&#39;);
          $class = $plugin[&#39;name&#39;].&#39;_actions&#39;;
          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).&#39;->&#39;.$method;
    //将插件的引用连同方法push进监听数组中
    $this->_listeners[$hook][$key] = array(&$reference, $method);
    #此处做些日志记录方面的东西
  }
  /**
   * 触发一个钩子
   *
   * @param string $hook 钩子的名称
   * @param mixed $data 钩子的入参
   *  @return mixed
   */
  function trigger($hook, $data=&#39;&#39;)
  {
    $result = &#39;&#39;;
    //查看要实现的钩子,是否在监听数组之中
    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;
  }
}

La prochaine étape est la mise en œuvre de DEMO_actions, un simple plug-in. Il s'agit d'un simple plug-in Hello World permettant de générer une phrase. Dans des situations réelles, say_hello peut inclure des opérations sur la base de données ou une autre logique spécifique.

<?php
/**
* 这是一个Hello World简单插件的实现
*/
/**
*需要注意的几个默认规则:
*  1. 本插件类的文件名必须是action
*  2. 插件类的名称必须是{插件名_actions}
*/
class DEMO_actions
{
  //解析函数的参数是pluginManager的引用
  function __construct(&$pluginManager)
  {
    //注册这个插件
    //第一个参数是钩子的名称
    //第二个参数是pluginManager的引用
    //第三个是插件所执行的方法
    $pluginManager->register(&#39;demo&#39;, $this, &#39;say_hello&#39;);
  }

  function say_hello()
  {
    echo &#39;Hello World&#39;;
  }
}

Ensuite, l'étape suivante est celle où l'appel du plug-in est déclenché. Par exemple, si je veux mettre say_hello sur la page d'accueil de mon blog. , Index.php, alors vous êtes dans index Écrivez quelque part dans .php :

$pluginManager->trigger(&#39;demo&#39;,&#39;&#39;);

Le premier paramètre représente le nom du hook, et le second Le paramètre est l'entrée de la méthode correspondante des paramètres du plug-in, puisqu'il n'y a pas de paramètres d'entrée dans cet exemple, ils sont vides.

Un tel exemple exprime fondamentalement clairement la méthode de mise en œuvre et la logique du mécanisme de plug-in « hook ».

Recommandations associées :

Framework Thinkphp5 Implémentation simple du hook de comportement Hook

Le webhook écrit en PHP ne peut pas exécuter git

Explication détaillée de la façon dont PHP implémente le mécanisme Hook

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn