行为事件类:
<?php
class Event
{
public $name;
public $sender;
public $handled = false;
public $data = [];
private static $_events = [];
public static function on($class, $name, $handler, $data = null, $append = true)
{
$class = ltrim($class, '\\');
if ($append || empty(self::$_events[$name][$class])) {
self::$_events[$name][$class][] = [$handler, $data];
} else {
array_unshift(self::$_events[$name][$class], [$handler, $data]);
}
}
public static function off($class, $name, $handler = null)
{
$class = ltrim($class, '\\');
if (empty(self::$_events[$name][$class])) {
return false;
}
if ($handler === null) {
unset(self::$_events[$name][$class]);
return true;
} else {
$removed = false;
foreach (self::$_events[$name][$class] as $i => $event) {
if ($event[0] === $handler) {
unset(self::$_events[$name][$class][$i]);
$removed = true;
}
}
if ($removed) {
self::$_events[$name][$class] = array_values(self::$_events[$name][$class]);
}
return $removed;
}
}
public static function trigger($class, $name, $event = null)
{
if (empty(self::$_events[$name])) {
return;
}
if ($event === null) {
$event = new static;
}
$event->handled = false;
$event->name = $name;
if (is_object($class)) {
if ($event->sender === null) {
$event->sender = $class;
}
$class = get_class($class);
} else {
$class = ltrim($class, '\\');
}
$classes = array_merge(
[$class],
class_parents($class, true),
class_implements($class, true)
);
foreach ($classes as $class) {
if (!empty(self::$_events[$name][$class])) {
foreach (self::$_events[$name][$class] as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
if ($event->handled) {
return;
}
}
}
}
}
}使用案例
<?php
require 'event.php';
class Object {
public function on($name, $handle) {
Event::on(get_class($this), $name, $handle[0], isset($handle[1]) ? $handle[1] : []);
}
public function off($name, $handle) {
Event::off(get_class($this), $name, $handle[0]);
}
public function trigger($name, $event = null) {
Event::trigger(get_class($this), $name, $event);
}
}
class UserCheck {
public static function check($event) {
echo "检查权限<br />";
}
}
class UserNotice {
public static function notice() {
echo "用户通知<br />";
}
}
class User extends Object {
const BEFORE_LOGIN = 'before_login';
const AFTER_LOGIN = 'after_login';
public function __construct() {
$this->on(self::BEFORE_LOGIN, ['UserCheck::check', array('test' => 1)]);
$this->on(self::AFTER_LOGIN, ['UserNotice::notice']);
$this->on(self::AFTER_LOGIN, [[$this, 'sendEmail']]);
$this->on(self::AFTER_LOGIN, [[$this, 'addPoint']]);
}
public function register() {
$this->trigger(self::BEFORE_LOGIN);
echo "注册成功<br />";
$this->off(self::AFTER_LOGIN, [[$this, 'sendEmail']]);
$this->trigger(self::AFTER_LOGIN);
}
public function sendEmail() {
echo "发送邮件<br />";
}
public function addPoint() {
echo "赠送积分<br />";
}
}
$user = new User();
$user->register();
来源:原创
发布时间:2022-07-13 12:46:37