recherche
Maisondéveloppement back-endtutoriel phpExplication détaillée de la façon dont PHP implémente le mécanisme Hook

Comment PHP implémente-t-il le mécanisme Hook ? Cet article présente principalement comment implémenter le mécanisme Hook en PHP, et 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, et ceux qui sont intéressés peuvent en apprendre davantage. J'espère que cela aide tout le monde.

Je ne connais en fait pas le concept de "hook". J'ai récemment vu ce mécanisme utilisé dans un framework PHP pour étendre le projet, je vais donc y jeter un oeil.

Le mécanisme dit Hook est une technologie populaire dans la programmation Windows. L'idée principale est d'enterrer (prédéfinir) un hook à l'avance où des fonctionnalités peuvent être ajoutées. Ce hook n'a aucune signification pratique. Lorsque nous devons re-modifier ou ajouter de la logique à 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. Regardons 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;;
  }
}

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 écrivez quelque part dans index.php. :

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

Le premier paramètre représente le nom du hook, et le deuxième paramètre est le paramètre d'entrée de la méthode correspondante du plug-in Puisqu'il n'y a pas de paramètres d'entrée dans cet exemple, c'est le cas. vide.

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 :

Explication détaillée de la bibliothèque de fonctions BC d'opération de haute précision PHP

Explication détaillée de l'utilisation de PHP pour trouver la sous-chaîne commune la plus longue de deux chaînes

Explication détaillée de la base de données d'exploitation PHP basée sur ORM

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
Qu'est-ce que l'APD dans PHP?Qu'est-ce que l'APD dans PHP?Apr 28, 2025 pm 04:51 PM

L'article traite des objets de données PHP (PDO), une extension pour l'accès à la base de données dans PHP. Il met en évidence le rôle de PDO dans l'amélioration de la sécurité grâce à des instructions préparées et à ses avantages sur MySQLI, y compris l'abstraction de la base de données et une meilleure gestion des erreurs.

Qu'est-ce que Memcache et Memcached en PHP? Est-il possible de partager une seule instance d'un Memcache entre plusieurs projets de PHP?Qu'est-ce que Memcache et Memcached en PHP? Est-il possible de partager une seule instance d'un Memcache entre plusieurs projets de PHP?Apr 28, 2025 pm 04:47 PM

MemCache et Memcached sont des systèmes de mise en cache PHP qui accélèrent les applications Web en réduisant la charge de base de données. Une seule instance peut être partagée entre des projets avec une gestion clé.

Quelles sont les étapes pour créer une nouvelle base de données à l'aide de MySQL et PHP?Quelles sont les étapes pour créer une nouvelle base de données à l'aide de MySQL et PHP?Apr 28, 2025 pm 04:44 PM

L'article traite des étapes pour créer et gérer les bases de données MySQL à l'aide de PHP, en se concentrant sur la connexion, la création, les erreurs courantes et les mesures de sécurité.

JavaScript interagit-il avec PHP?JavaScript interagit-il avec PHP?Apr 28, 2025 pm 04:43 PM

L'article explique comment JavaScript et PHP interagissent indirectement via les demandes HTTP en raison de leurs différents environnements. Il couvre les méthodes pour l'envoi de données de JavaScript à PHP et met en évidence des considérations de sécurité comme la validation des données et le prot

Qu'est-ce que la poire en php?Qu'est-ce que la poire en php?Apr 28, 2025 pm 04:38 PM

Pear est un cadre PHP pour les composants réutilisables, l'amélioration du développement avec la gestion des packages, les normes de codage et le soutien communautaire.

Quelles sont les utilisations de PHP?Quelles sont les utilisations de PHP?Apr 28, 2025 pm 04:37 PM

PHP est un langage de script polyvalent utilisé principalement pour le développement Web, la création de pages dynamiques, et peut également être utilisé pour les scripts en ligne de commande, les applications de bureau et le développement d'API.

Quel était l'ancien nom de PHP?Quel était l'ancien nom de PHP?Apr 28, 2025 pm 04:36 PM

L'article traite de l'évolution de PHP des "outils personnels de la page d'accueil" en 1995 à "PHP: Hypertext Preprocessor" en 1998, reflétant son utilisation élargie au-delà des sites Web personnels.

Comment pouvez-vous empêcher les attaques de fixation de session?Comment pouvez-vous empêcher les attaques de fixation de session?Apr 28, 2025 am 12:25 AM

Des méthodes efficaces pour empêcher les attaques fixes de session incluent: 1. Régénérer l'ID de session après que l'utilisateur se connecte; 2. Utilisez un algorithme de génération d'ID de session sécurisé; 3. Mettre en œuvre le mécanisme de délai d'expiration de la session; 4. Cryptez les données de session à l'aide de HTTPS. Ces mesures peuvent garantir que l'application est indestructible lorsqu'il est confronté à des attaques fixes de session.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Version crackée d'EditPlus en chinois

Version crackée d'EditPlus en chinois

Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

MinGW - GNU minimaliste pour Windows

MinGW - GNU minimaliste pour Windows

Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel