1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| <?php
class Event { protected static $listens = array();
public static function listen($event, $callback, $once = false) { if (!is_callable($callback)) return false; self::$listens[$event][] = array('callback' => $callback, 'once' => $once); return true; }
public static function one($event, $callback) { return self::listen($event, $callback, true); }
public static function remove($event, $index = null) { if (is_null($index)) unset(self::$listens[$event]); else unset(self::$listens[$event][$index]); }
public static function trigger() { if (!func_num_args()) return; $args = func_get_args(); $event = array_shift($args); if (!isset(self::$listens[$event])) return false; foreach ((array)self::$listens[$event] as $index => $listen) { $callback = $listen['callback']; $listen['once'] && self::remove($event, $index); call_user_func_array($callback, $args); } } }
Event::listen('walk', function () { echo "I am walking...n"; });
Event::listen('walk', function () { echo "I am listening...n"; }, true);
Event::trigger('walk');
Event::trigger('walk');
Event::one('say', function ($name = '') { echo "I am {$name}n"; });
Event::trigger('say', 'deeka'); Event::trigger('say', 'deeka');
class Foo { public function bar() { echo "Foo::bar() is calledn"; }
public function test() { echo "Foo::foo() is called, agrs:" . json_encode(func_get_args()) . "n"; } }
$foo = new Foo;
Event::listen('bar', array($foo, 'bar')); Event::trigger('bar');
Event::listen('test', array($foo, 'test')); Event::trigger('test', 1, 2, 3);
class Bar { public static function foo() { echo "Bar::foo() is calledn"; } }
Event::listen('bar1', array('Bar', 'foo')); Event::trigger('bar1');
Event::listen('bar2', 'Bar::foo'); Event::trigger('bar2');
function bar() { echo "bar() is calledn"; }
Event::listen('bar3', 'bar'); Event::trigger('bar3');
|