Heim  >  Artikel  >  Backend-Entwicklung  >  Implementierung des PHP-Ereignismechanismus

Implementierung des PHP-Ereignismechanismus

*文
*文Original
2017-12-26 16:39:191777Durchsuche

Wie implementiert PHP den Ereignismechanismus? In diesem Artikel wird hauptsächlich die Methode zur Implementierung des Ereignismechanismus in PHP vorgestellt und das Prinzip des Ereignismechanismus und die damit verbundene Implementierung von PHP anhand von Beispielen analysiert. Ich hoffe, es hilft allen.

Die spezifische Analyse lautet wie folgt:

Es gibt nicht viele Sprachen mit integriertem Ereignismechanismus, und PHP bietet eine solche Funktion nicht. Vereinfacht ausgedrückt ist ein Ereignis ein Beobachtermuster, das einfach zu implementieren ist. Der Unterschied besteht jedoch darin, dass jeder einen Ereignis-Listener hinzufügen kann, dieser jedoch nur durch das Objekt ausgelöst werden kann, das ihn direkt enthält. Das ist ein bisschen schwierig. PHP verfügt über eine debug_backtrace-Funktion, die den aktuellen Aufrufstapel abrufen kann. Auf diese Weise können Sie feststellen, ob das Objekt, das die ereignisauslösende Funktion aufruft, sein Objekt direkt enthält.


<?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);
    }
  }
}

Verwandte Empfehlungen:

Beispielanalyse, wie PHP simulierte HTTP-Anfragen implementiert

Detaillierte Erläuterung der Socket-Push-Technologie in PHP

PHPCrawl-Crawler-Bibliothek zur Implementierung von packenden Kugou-Songs Liste

Das obige ist der detaillierte Inhalt vonImplementierung des PHP-Ereignismechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn