Signatur
Beschreibung
Ds\Queue ist eine Warteschlange (Queue) aus der Data Structures-Erweiterung (ext-ds), die das FIFO-Prinzip umsetzt: Das zuerst eingefügte Element wird auch als erstes wieder entnommen. Intern basiert sie auf einer Ds\Deque, was effiziente Operationen an beiden Enden ermöglicht.
Typische Anwendungsfälle sind Job-Queues, Nachrichtenwarteschlangen, Aufgabenpuffer oder Breadth-First-Search-Algorithmen, bei denen die Verarbeitungsreihenfolge exakt der Eingangsreihenfolge entsprechen muss.
Im Vergleich zu einem PHP-Array, das mit array_push()/array_shift() als Queue missbraucht wird, ist Ds\Queue deutlich speichereffizienter und semantisch klar. Der Zugriff auf einzelne Elemente per Index ist bewusst nicht erlaubt, um das FIFO-Prinzip durchzusetzen.
- push() – Element hinten einfügen
- pop() – Element vorne entnehmen (und entfernen)
- peek() – Element vorne ansehen (ohne Entfernen)
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $values | iterable | [] | Optionaler iterierbarer Anfangswert (Array oder Traversable), dessen Elemente in die Queue eingefügt werden. |
Rückgabewert
Beispiele
Grundlegende Queue-Nutzung (FIFO)
<?php
$queue = new Ds\Queue();
$queue->push('Task A');
$queue->push('Task B');
$queue->push('Task C');
echo 'Größe: ' . $queue->count() . PHP_EOL;
echo 'Vorne: ' . $queue->peek() . PHP_EOL;
while (!$queue->isEmpty()) {
echo $queue->pop() . PHP_EOL;
}
Queue aus Array initialisieren und verarbeiten
<?php
$jobs = ['E-Mail senden', 'Bericht generieren', 'Cache leeren'];
$queue = new Ds\Queue($jobs);
echo 'Jobs in der Queue: ' . $queue->count() . PHP_EOL;
while (!$queue->isEmpty()) {
$job = $queue->pop();
echo 'Verarbeite: ' . $job . PHP_EOL;
}
echo 'Queue leer: ' . ($queue->isEmpty() ? 'Ja' : 'Nein') . PHP_EOL;
Breadth-First-Search mit Ds\Queue
<?php
$graph = [
'A' => ['B', 'C'],
'B' => ['D', 'E'],
'C' => ['F'],
'D' => [], 'E' => [], 'F' => []
];
$queue = new Ds\Queue();
$queue->push('A');
$visited = [];
while (!$queue->isEmpty()) {
$node = $queue->pop();
if (in_array($node, $visited)) continue;
$visited[] = $node;
echo 'Besuche Knoten: ' . $node . PHP_EOL;
foreach ($graph[$node] as $neighbor) {
$queue->push($neighbor);
}
}
// Wichtig · Fallstricke
Erweiterung erforderlich: Ds\Queue ist Teil der PECL-Erweiterung ext-ds und nicht im PHP-Kern enthalten. Installation via pecl install ds oder als Composer-Paket php-ds/php-ds (Polyfill).
Kein Index-Zugriff: Im Gegensatz zu Arrays erlaubt Ds\Queue keinen direkten Index-Zugriff ($queue[0] wirft eine Error-Exception). Dies ist eine bewusste Design-Entscheidung zur Sicherstellung des FIFO-Prinzips.
pop() auf leerer Queue: Der Aufruf von pop() oder peek() auf einer leeren Queue wirft eine UnderflowException. Vor dem Zugriff immer isEmpty() prüfen.
Speichereffizienz: Ds\Queue verbraucht im Vergleich zu einem PHP-Array in vielen Szenarien deutlich weniger Speicher, da die interne Ds\Deque kein Rehashing benötigt.