ClassEvent.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace loyalsoft\Util;
  3. /**
  4. * 事件类的traits
  5. * 用法: 参考event.php
  6. * @version
  7. * 1.0.0 Created at 2017-12-9. by --gwang
  8. * 0.0.0 Copy and learned from web. -2017-12-9
  9. * @author gwang (mail@wanggangzero.cn)
  10. * @copyright ? 2017-12-9, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  11. */
  12. trait ClassEvent {
  13. /**
  14. * 事件绑定记录
  15. */
  16. protected $events = array();
  17. /**
  18. * 注册事件
  19. * @param string $event
  20. * @param mixed $callback
  21. * @param bool $first 是否优先执行,以靠后设置的为准
  22. */
  23. public function register($event, $callback, $first = false, $once = false) {
  24. if (!isset($this->events[$event])) {
  25. $this->events[$event] = array();
  26. }
  27. $item = array(
  28. 'callback' => $callback,
  29. 'once' => $once,
  30. );
  31. if ($first) {
  32. array_unshift($this->events[$event], $item);
  33. } else {
  34. $this->events[$event][] = $item;
  35. }
  36. }
  37. /**
  38. * 注册事件,register的别名
  39. * @param string $event
  40. * @param mixed $callback
  41. * @param bool $first 是否优先执行,以靠后设置的为准
  42. */
  43. public function on($event, $callback, $first = false) {
  44. $this->register($event, $callback, $first);
  45. }
  46. /**
  47. * 注册一次性事件
  48. * @param string $event
  49. * @param mixed $callback
  50. * @param boolean $first 是否优先执行,以靠后设置的为准
  51. */
  52. public function once($event, $callback, $first = false) {
  53. $this->register($event, $callback, $first, true);
  54. }
  55. /**
  56. * 触发事件(监听事件)
  57. * @param name $event
  58. * @param array $params
  59. * @return mixed
  60. */
  61. protected function trigger($event, $params = array()) {
  62. if (isset($this->events[$event])) {
  63. foreach ($this->events[$event] as $key => $item) {
  64. if (true === $item['once']) {
  65. unset($this->events[$event][$key]);
  66. }
  67. if (true === call_user_func($item['callback'], $params)) {
  68. return true; // 事件返回true时不继续执行其余事件
  69. }
  70. }
  71. return false;
  72. }
  73. return true;
  74. }
  75. }