Signatur
Beschreibung
readline_completion_function() ermöglicht es, eine eigene PHP-Funktion zu hinterlegen, die aufgerufen wird, wenn der Benutzer in einer interaktiven Konsolenanwendung die Tab-Taste drückt. Die registrierte Callback-Funktion erhält den bisher eingegebenen Text und gibt ein Array mit Vervollständigungsvorschlägen zurück.
Diese Funktion ist besonders nützlich beim Bau interaktiver CLI-Werkzeuge, REPL-Shells oder Kommandozeilen-Interfaces, bei denen dem Benutzer Autovervollständigung für Befehle, Dateinamen oder andere Eingaben angeboten werden soll. Sie setzt voraus, dass die readline-Erweiterung kompiliert und verfügbar ist (typischerweise unter Linux/macOS, nicht unter Windows).
Der Callback erhält als erstes Argument den bisher eingetippten Text (string $input) und als zweites Argument den Cursor-Index (int $index). Er sollte ein Array von Strings zurückgeben, die als Vervollständigungsoptionen angeboten werden. Gibt er ein leeres Array oder null zurück, werden keine Vorschläge angezeigt.
Die Funktion arbeitet direkt mit der zugrunde liegenden GNU-Readline-Bibliothek zusammen. Eine einmal registrierte Funktion bleibt für alle nachfolgenden readline()-Aufrufe aktiv, bis sie durch einen erneuten Aufruf von readline_completion_function() überschrieben wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback Pflicht | callable | Eine aufrufbare Funktion (Closure, Funktionsname als String oder Array mit Objekt/Klasse und Methode), die bei Tab-Vervollständigung aufgerufen wird. Sie erhält den aktuellen Eingabetext (string $input) und den Cursor-Index (int $index) und muss ein Array mit Vervollständigungs-Kandidaten zurückgeben. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die readline-Erweiterung nicht verfügbar ist).Beispiele
Einfache Befehlsvervollständigung für eine CLI-Shell
<?php
// Liste bekannter Befehle
$commands = ['help', 'exit', 'list', 'load', 'save', 'status', 'version'];
// Vervollständigungs-Callback registrieren
readline_completion_function(function (string $input, int $index) use ($commands): array {
if ($input === '') {
// Keine Eingabe: alle Befehle anbieten
return $commands;
}
// Nur passende Befehle zurückgeben
return array_values(array_filter($commands, function (string $cmd) use ($input): bool {
return strncmp($cmd, $input, strlen($input)) === 0;
}));
});
echo "Interaktive Shell (Tab für Vervollständigung, 'exit' zum Beenden)" . PHP_EOL;
while (true) {
$line = readline('> ');
if ($line === false || trim($line) === 'exit') {
echo "Auf Wiedersehen!" . PHP_EOL;
break;
}
if (trim($line) !== '') {
readline_add_history($line);
}
echo "Eingabe: " . htmlspecialchars($line) . PHP_EOL;
}
Dateinamen-Vervollständigung aus einem Verzeichnis
<?php
// Vervollständigung mit Dateinamen aus dem aktuellen Verzeichnis
readline_completion_function(function (string $input, int $index): array {
$dir = '.';
$files = scandir($dir);
if ($files === false) {
return [];
}
// Versteckte Dateien ausblenden und nach Eingabe filtern
return array_values(array_filter($files, function (string $file) use ($input): bool {
return $file[0] !== '.' && ($input === '' || strncmp($file, $input, strlen($input)) === 0);
}));
});
echo "Datei eingeben (Tab für Vervollständigung):" . PHP_EOL;
$filename = readline('Datei: ');
if ($filename !== false && $filename !== '') {
readline_add_history($filename);
echo "Ausgewählt: " . $filename . PHP_EOL;
} else {
echo "Keine Eingabe." . PHP_EOL;
}
// Wichtig · Fallstricke
Plattformabhängigkeit: Die readline-Erweiterung steht standardmäßig nur unter Linux und macOS zur Verfügung und ist von der GNU-Readline-Bibliothek abhängig. Unter Windows ist sie in der Regel nicht verfügbar. Überprüfe die Verfügbarkeit mit function_exists('readline_completion_function').
Nur für interaktive Terminals: Die Vervollständigungsfunktion hat ausschließlich Wirkung, wenn das PHP-Skript in einem interaktiven Terminal ausgeführt wird. Bei Pipes oder nicht-interaktiven Prozessen bleibt der Callback ohne Effekt.
Einzelne Registrierung: Es kann immer nur eine einzige Vervollständigungsfunktion aktiv sein. Ein erneuter Aufruf überschreibt die zuvor registrierte Funktion vollständig.