Maison > développement back-end > tutoriel php > Le principe du mécanisme d'événement PHP

Le principe du mécanisme d'événement PHP

墨辰丷
Libérer: 2023-03-31 08:34:02
original
3215 Les gens l'ont consulté

Cet article présente principalement les principes du mécanisme d'événements PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

L'exemple de cet article décrit comment PHP implémente le mécanisme d'événements. L'analyse spécifique est la suivante :

Il n'y a pas beaucoup de langages avec un mécanisme d'événements intégré, et PHP ne le fournit pas. une telle fonction. Pour faire simple, un événement est un modèle Observer, facile à mettre en œuvre. Mais la différence est que n'importe qui peut ajouter un écouteur d'événement, mais celui-ci ne peut être déclenché que par l'objet qui le contient directement. C'est un peu difficile. PHP a une fonction debug_backtrace, qui peut obtenir la pile d'appels actuelle, à partir de laquelle vous pouvez trouver un moyen de déterminer si l'objet qui appelle la fonction de déclenchement d'événement contient directement son objet.

<?php
/**
* 事件
*
* @author xiezhenye <xiezhenye@gmail.com>
*/
class Event {
  private $callbacks = array();
  private $holder;
  function __construct() {
    $bt = debug_backtrace();
    if (count($bt) < 2) {
      $this->holder = null;
      return;
    }
    $this->holder = &$bt[1][&#39;object&#39;];
  }
  function attach() {
    $args = func_get_args();
    switch (count($args)) {
      case 1:
        if (is_callable($args[0])) {
          $this->callbacks[]= $args[0];
          return;
        }
        break;
      case 2:
        if (is_object($args[0]) && is_string($args[1])) {
          $this->callbacks[]= array(&$args[0], $args[1]);
        }
        return;
      default:
        return;
    }
  }
  function notify() {
    $bt = debug_backtrace();
    if ($this->holder && 
        ((count($bt) >= 2 && $bt[count($bt) - 1][&#39;object&#39;] !== $this->holder)
        || (count($bt) < 2))) {
      throw(new Exception(&#39;Notify can only be called in holder&#39;));
    }
    foreach ($this->callbacks as $callback) {
      $args = func_get_args();
      call_user_func_array($callback, $args);
    }
  }
}
Copier après la connexion

Résumé : Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

php utilise des expressions régulières pour extraire des liens dans le contenu

PHP implémente le caractère chinois Code de vérification

php implémente le chargement des polices et l'enregistrement

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal