This article mainly introduces the principles of PHP event mechanism. Interested friends can refer to it. I hope it will be helpful to everyone.
The example in this article describes how PHP implements the event mechanism. The specific analysis is as follows:
There are not many languages with built-in event mechanisms, 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> */ 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); } } }
Summary: The above is the entire content of this article, I hope it will be helpful to everyone's study.
Related recommendations:
php uses regular expressions to extract links in the content
PHP implements Chinese character verification Code
The above is the detailed content of The principle of PHP event mechanism. For more information, please follow other related articles on the PHP Chinese website!