Emitter.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace PHPSocketIO\Event;
  3. use PHPSocketIO\Debug;
  4. class Emitter
  5. {
  6. public function __construct()
  7. {
  8. Debug::debug('Emitter __construct');
  9. }
  10. public function __destruct()
  11. {
  12. Debug::debug('Emitter __destruct');
  13. }
  14. /**
  15. * [event=>[[listener1, once?], [listener2,once?], ..], ..]
  16. */
  17. protected $_eventListenerMap = array();
  18. public function on($event_name, $listener)
  19. {
  20. $this->emit('newListener', $event_name, $listener);
  21. $this->_eventListenerMap[$event_name][] = array($listener, 0);
  22. return $this;
  23. }
  24. public function once($event_name, $listener)
  25. {
  26. $this->_eventListenerMap[$event_name][] = array($listener, 1);
  27. return $this;
  28. }
  29. public function removeListener($event_name, $listener)
  30. {
  31. if(!isset($this->_eventListenerMap[$event_name]))
  32. {
  33. return $this;
  34. }
  35. foreach($this->_eventListenerMap[$event_name] as $key=>$item)
  36. {
  37. if($item[0] === $listener)
  38. {
  39. $this->emit('removeListener', $event_name, $listener);
  40. unset($this->_eventListenerMap[$event_name][$key]);
  41. }
  42. }
  43. if(empty($this->_eventListenerMap[$event_name]))
  44. {
  45. unset($this->_eventListenerMap[$event_name]);
  46. }
  47. return $this;
  48. }
  49. public function removeAllListeners($event_name = null)
  50. {
  51. $this->emit('removeListener', $event_name);
  52. if(null === $event_name)
  53. {
  54. $this->_eventListenerMap = array();
  55. return $this;
  56. }
  57. unset($this->_eventListenerMap[$event_name]);
  58. return $this;
  59. }
  60. public function listeners($event_name)
  61. {
  62. if(empty($this->_eventListenerMap[$event_name]))
  63. {
  64. return array();
  65. }
  66. $listeners = array();
  67. foreach($this->_eventListenerMap[$event_name] as $item)
  68. {
  69. $listeners[] = $item[0];
  70. }
  71. return $listeners;
  72. }
  73. public function emit($event_name = null)
  74. {
  75. if(empty($event_name) || empty($this->_eventListenerMap[$event_name]))
  76. {
  77. return false;
  78. }
  79. foreach($this->_eventListenerMap[$event_name] as $key=>$item)
  80. {
  81. $args = func_get_args();
  82. unset($args[0]);
  83. call_user_func_array($item[0], $args);
  84. // once ?
  85. if($item[1])
  86. {
  87. unset($this->_eventListenerMap[$event_name][$key]);
  88. if(empty($this->_eventListenerMap[$event_name]))
  89. {
  90. unset($this->_eventListenerMap[$event_name]);
  91. }
  92. }
  93. }
  94. return true;
  95. }
  96. }