The example in this article describes the event mechanism implemented based on PHP. Share it with everyone for your reference. The specific analysis is as follows:
There are not many languages with built-in event mechanism, and PHP does not provide such a function. To put it simply, an event is an Observer pattern, which is easy to implement. But the difference is that anyone can add an event listener, but it can only be triggered by the object that directly contains it. This is a little bit difficult. PHP has a debug_backtrace function, which can get the current call stack. From this, you can find a way to determine whether the object that calls the event triggering function directly contains its object.
<?php /** * 事件 * * @author xiezhenye <xiezhenye@gmail.com> * @since 2007-7-20 */ class Event { private $callbacks = array(); private $holder; function __construct() { $bt = debug_backtrace(); if (count($bt) < 2) { $this->holder = null; return; } $this->holder = &$bt[1]['object']; } 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]['object'] !== $this->holder) || (count($bt) < 2))) { throw(new Exception('Notify can only be called in holder')); } foreach ($this->callbacks as $callback) { $args = func_get_args(); call_user_func_array($callback, $args); } } }
I hope this article will be helpful to everyone’s PHP programming design.