PHP实现一个简单的事件逻辑
php
php, swoole
字数统计: 522(字)
阅读时长: 2(分)
很多被广泛使用的CMS,之所以被这么多人应用,就是因为他们的插件机制,可以实现丰富多彩的功能。而插件机制很大程度依赖于事件,在一些关键位置触发事件,可以方便二次开发,并且不更改系统核心代码。
事件机制本身并不复杂,我们不扯概念理论,直接上代码来看。看完此篇文章,或许可以有助让你更加深刻的理解 laravel 的 route 事件。比如我们有一个添加用户的方法,代码如下:
1 2 3 4
| function addUser($userInfo) { $db->execute('insert into tb_users(xxx)'); }
|
如果我想要我的系统在添加用户以后,可以让二次开发者做一些自定义处理,那么这时候可以使用事件。下面贴出YurunPHP的Event类代码:
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
| <?php
class Event {
private static $events = array();
public static function register($event, $callback, $first=false) { if (! isset(self::$events[$event])) { self::$events[$event] = array (); } if($first) { array_unshift(self::$events[$event],$callback); } else { self::$events[$event][] = $callback; } }
public static function trigger($event, $params=array()) { if (isset(self::$events[$event])) { foreach (self::$events[$event] as $item) { if(true === call_user_func($item,$params)) { return true; } } return false; } return true; } }
|
使用Event类监听一个事件
1 2 3 4 5 6 7 8
| function addUser($userInfo) { $result = $db->execute('insert into tb_users(xxx)'); Event::trigger('ON_USER_ADD',array('userInfo'=>$userInfo,'result'=>&$result)); }
|
在其它地方注册事件进行处理,事件名称是 ON_USER_ADD
1 2 3 4
| Event::register('ON_USER_ADD',function($data){ var_dump($data); });
|
其实原理很简单,就比如先挖个坑,然后再填进去。PHP中主要依靠 call_user_func 这类动态调用函数方法的函数来实现。