Start · Sprachen · PHP · Referenz · Ds\Queue

Ds\Queue

Klasse

Eine FIFO-Datenstruktur (First-In-First-Out), die Elemente in der Reihenfolge ihrer Einfügung verarbeitet.

seit PHP 1.0.0 Kategorie: oop

Signatur

class Ds\Queue implements Ds\Collection

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

Typ

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;
}
Größe: 3 Vorne: Task A Task A Task B Task C

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;
Jobs in der Queue: 3 Verarbeite: E-Mail senden Verarbeite: Bericht generieren Verarbeite: Cache leeren Queue leer: Ja

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);
    }
}
Besuche Knoten: A Besuche Knoten: B Besuche Knoten: C Besuche Knoten: D Besuche Knoten: E Besuche Knoten: F

// 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.