ClassEvent.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. */
  17. protected $events = array();
  18. /**
  19. * 注册事件
  20. * @param string $event
  21. * @param mixed $callback
  22. * @param bool $first 是否优先执行,以靠后设置的为准
  23. */
  24. public function register($event, $callback, $first = false, $once = false)
  25. {
  26. if (!isset($this->events[$event])) {
  27. $this->events[$event] = array();
  28. }
  29. $item = array(
  30. 'callback' => $callback,
  31. 'once' => $once,
  32. );
  33. if ($first) {
  34. array_unshift($this->events[$event], $item);
  35. } else {
  36. $this->events[$event][] = $item;
  37. }
  38. }
  39. /**
  40. * 注册事件,register的别名
  41. * @param string $event
  42. * @param mixed $callback
  43. * @param bool $first 是否优先执行,以靠后设置的为准
  44. */
  45. public function on($event, $callback, $first = false)
  46. {
  47. $this->register($event, $callback, $first);
  48. }
  49. /**
  50. * 注册一次性事件
  51. * @param string $event
  52. * @param mixed $callback
  53. * @param boolean $first 是否优先执行,以靠后设置的为准
  54. */
  55. public function once($event, $callback, $first = false)
  56. {
  57. $this->register($event, $callback, $first, true);
  58. }
  59. /**
  60. * 触发事件(监听事件)
  61. * @param name $event
  62. * @param array $params
  63. * @return mixed
  64. */
  65. protected function trigger($event, $params = array())
  66. {
  67. if (isset($this->events[$event])) {
  68. foreach ($this->events[$event] as $key => $item) {
  69. if (true === $item['once']) {
  70. unset($this->events[$event][$key]);
  71. }
  72. if (true === call_user_func($item['callback'], $params)) {
  73. // 事件返回true时不继续执行其余事件
  74. return true;
  75. }
  76. }
  77. return false;
  78. }
  79. return true;
  80. }
  81. }