ts3phpframework
Loading...
Searching...
No Matches
Signal.php
Go to the documentation of this file.
1<?php
2
3namespace PlanetTeamSpeak\TeamSpeak3Framework\Helper;
4
5use PlanetTeamSpeak\TeamSpeak3Framework\Exception\HelperException;
6use PlanetTeamSpeak\TeamSpeak3Framework\Exception\SignalException;
7use PlanetTeamSpeak\TeamSpeak3Framework\Helper\Signal\Handler;
8
15class Signal
16{
22 protected static ?Signal $instance = null;
23
29 protected array $sigslots = [];
30
41 public function emit(string $signal, mixed $params = null): mixed
42 {
43 if (!$this->hasHandlers($signal)) {
44 return null;
45 }
46
47 if (!is_array($params)) {
48 $params = func_get_args();
49 $params = array_slice($params, 1);
50 }
51
52 foreach ($this->sigslots[$signal] as $slot) {
53 $return = $slot->call($params);
54 }
55
56 return $return;
57 }
58
66 public function getCallbackHash(mixed $callback): string
67 {
68 if (!is_callable($callback, true, $callable_name)) {
69 throw new SignalException("invalid callback specified");
70 }
71
72 return md5($callable_name);
73 }
74
83 public function subscribe(string $signal, mixed $callback): Handler
84 {
85 if (empty($this->sigslots[$signal])) {
86 $this->sigslots[$signal] = [];
87 }
88
89 $index = $this->getCallbackHash($callback);
90
91 if (!array_key_exists($index, $this->sigslots[$signal])) {
92 $this->sigslots[$signal][$index] = new Handler($signal, $callback);
93 }
94
95 return $this->sigslots[$signal][$index];
96 }
97
106 public function unsubscribe(string $signal, mixed $callback = null): void
107 {
108 if (!$this->hasHandlers($signal)) {
109 return;
110 }
111
112 if ($callback !== null) {
113 $index = $this->getCallbackHash($callback);
114
115 if (!array_key_exists($index, $this->sigslots[$signal])) {
116 return;
117 }
118
119 unset($this->sigslots[$signal][$index]);
120 } else {
121 unset($this->sigslots[$signal]);
122 }
123 }
124
130 public function getSignals(): array
131 {
132 return array_keys($this->sigslots);
133 }
134
141 public function hasHandlers(string $signal): bool
142 {
143 return !empty($this->sigslots[$signal]);
144 }
145
152 public function getHandlers(string $signal): array
153 {
154 if ($this->hasHandlers($signal)) {
155 return $this->sigslots[$signal];
156 }
157
158 return [];
159 }
160
167 public function clearHandlers(string $signal): void
168 {
169 if ($this->hasHandlers($signal)) {
170 unset($this->sigslots[$signal]);
171 }
172 }
173
179 public static function getInstance(): ?Signal
180 {
181 if (self::$instance === null) {
182 self::$instance = new self();
183 }
184
185 return self::$instance;
186 }
187}
Enhanced exception class for PlanetTeamSpeak\TeamSpeak3Framework\Helper\Signal\Handler objects.
Helper class providing handler functions for signals.
Definition Handler.php:14
unsubscribe(string $signal, mixed $callback=null)
Definition Signal.php:106
subscribe(string $signal, mixed $callback)
Definition Signal.php:83
emit(string $signal, mixed $params=null)
Definition Signal.php:41