Maison  >  Article  >  développement back-end  >  Implémentation du mécanisme d'événement PHP

Implémentation du mécanisme d'événement PHP

*文
*文original
2017-12-26 16:39:191777parcourir

Comment PHP implémente-t-il le mécanisme d'événements ? Cet article présente principalement la méthode d'implémentation du mécanisme d'événement en PHP, et analyse le principe du mécanisme d'événement et l'implémentation associée de PHP avec des exemples. J'espère que cela aide tout le monde.

L'analyse spécifique est la suivante :

Il n'y a pas beaucoup de langages avec un mécanisme d'événement intégré, et PHP ne 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 là, 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);
    }
  }
}

Recommandations associées :

Exemple d'analyse de la façon dont PHP implémente des requêtes http simulées

Explication détaillée de la technologie socket push en PHP

Bibliothèque de robots d'exploration PHPCrawl pour implémenter la chanson Grabbing Kugou liste

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