/** * Disconnects the $slot from the $signal with identifier $identifier.. * * If the priority is given it will try to disconnect a slot with that priority. * If no such slot is found no slot will be disconnected. * * If no priority is given it will disconnect the matching slot with the lowest priority. * * @param string $identifier * @param string $signal * @param callback $slot * @param int $priority * @return void */ public function disconnect($identifier, $signal, $slot, $priority = null) { if (!isset($this->connections[$identifier]) || !isset($this->connections[$identifier][$signal])) { return; } if ($priority === null) { $allKeys = array_keys($this->connections[$identifier][$signal]); rsort($allKeys, SORT_NUMERIC); foreach ($allKeys as $priority) { foreach ($this->connections[$identifier][$signal][$priority] as $key => $callback) { if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) { unset($this->properties['connections'][$identifier][$signal][$priority][$key]); // if the priority is empty now it should be unset if (count($this->properties['connections'][$identifier][$signal][$priority]) == 0) { unset($this->properties['connections'][$identifier][$signal][$priority]); } return; } } } } else { if (isset($this->connections[$identifier][$signal][$priority])) { foreach ($this->connections[$identifier][$signal][$priority] as $key => $callback) { if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) { unset($this->properties['connections'][$identifier][$signal][$priority][$key]); // if the priority is empty now it should be unset if (count($this->properties['connections'][$identifier][$signal][$priority]) == 0) { unset($this->properties['connections'][$identifier][$signal][$priority]); } return; } } } } }
/** * Disconnects the $slot from the $signal. * * If the priority is given it will try to disconnect a slot with that priority. * If no such slot is found no slot will be disconnected. * * If no priority is given it will disconnect the matching slot with the lowest priority. * * @throws ezcSignalSlotException if the signals options has been set and $signal is not in the list of signals. * @param string $signal * @param callback $slot * @param int $priority * @return void */ public function disconnect($signal, $slot, $priority = null) { // if the the signals option is set we must check if the signal exists if ($this->options->signals != null && !in_array($signal, $this->options->signals)) { throw new ezcSignalSlotException("No such signal {$signal}"); } if ($priority === null) { $priorityKeys = array(); if (isset($this->priorityConnections[$signal])) { $priorityKeys = array_keys($this->priorityConnections[$signal]); } $allPriorities = array_unique(array_merge($priorityKeys, array(1000))); rsort($allPriorities, SORT_NUMERIC); foreach ($allPriorities as $priority) { if ($priority === 1000) { if (isset($this->defaultConnections[$signal])) { foreach ($this->defaultConnections[$signal] as $key => $callback) { if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) { unset($this->defaultConnections[$signal][$key]); return; } } } } else { if (isset($this->priorityConnections[$signal]) && isset($this->priorityConnections[$signal][$priority])) { foreach ($this->priorityConnections[$signal][$priority] as $key => $callback) { if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) { unset($this->priorityConnections[$signal][$priority][$key]); // if the priority is empty now it should be unset if (count($this->priorityConnections[$signal][$priority]) == 0) { unset($this->priorityConnections[$signal][$priority]); } return; } } } } } } else { if ($priority === 1000) { if (isset($this->defaultConnections[$signal])) { foreach ($this->defaultConnections[$signal] as $key => $callback) { if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) { unset($this->defaultConnections[$signal][$key]); return; } } } } else { if (isset($this->priorityConnections[$signal]) && isset($this->priorityConnections[$signal][$priority])) { foreach ($this->priorityConnections[$signal][$priority] as $key => $callback) { if (ezcSignalCallbackComparer::compareCallbacks($slot, $callback)) { unset($this->priorityConnections[$signal][$priority][$key]); // if the priority is empty now it should be unset if (count($this->priorityConnections[$signal][$priority]) == 0) { unset($this->priorityConnections[$signal][$priority]); } return; } } } } } }