Emitter.php
2.7 KB
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
<?php
namespace PHPSocketIO\Event;
use PHPSocketIO\Debug;
class Emitter
{
public function __construct()
{
Debug::debug('Emitter __construct');
}
public function __destruct()
{
Debug::debug('Emitter __destruct');
}
/**
* [event=>[[listener1, once?], [listener2,once?], ..], ..]
*/
protected $_eventListenerMap = array();
public function on($event_name, $listener)
{
$this->emit('newListener', $event_name, $listener);
$this->_eventListenerMap[$event_name][] = array($listener, 0);
return $this;
}
public function once($event_name, $listener)
{
$this->_eventListenerMap[$event_name][] = array($listener, 1);
return $this;
}
public function removeListener($event_name, $listener)
{
if(!isset($this->_eventListenerMap[$event_name]))
{
return $this;
}
foreach($this->_eventListenerMap[$event_name] as $key=>$item)
{
if($item[0] === $listener)
{
$this->emit('removeListener', $event_name, $listener);
unset($this->_eventListenerMap[$event_name][$key]);
}
}
if(empty($this->_eventListenerMap[$event_name]))
{
unset($this->_eventListenerMap[$event_name]);
}
return $this;
}
public function removeAllListeners($event_name = null)
{
$this->emit('removeListener', $event_name);
if(null === $event_name)
{
$this->_eventListenerMap = array();
return $this;
}
unset($this->_eventListenerMap[$event_name]);
return $this;
}
public function listeners($event_name)
{
if(empty($this->_eventListenerMap[$event_name]))
{
return array();
}
$listeners = array();
foreach($this->_eventListenerMap[$event_name] as $item)
{
$listeners[] = $item[0];
}
return $listeners;
}
public function emit($event_name = null)
{
if(empty($event_name) || empty($this->_eventListenerMap[$event_name]))
{
return false;
}
foreach($this->_eventListenerMap[$event_name] as $key=>$item)
{
$args = func_get_args();
unset($args[0]);
call_user_func_array($item[0], $args);
// once ?
if($item[1])
{
unset($this->_eventListenerMap[$event_name][$key]);
if(empty($this->_eventListenerMap[$event_name]))
{
unset($this->_eventListenerMap[$event_name]);
}
}
}
return true;
}
}