Readline: примеры (PHP)
readline(string $prompt = ?): string|falseФункция readline() в PHP предназначена для интерактивного чтения строки ввода из командной строки (CLI). Она обычно используется в скриптах, требующих взаимодействия с пользователем через терминал.
Функция принимает один необязательный аргумент:
prompt(string) - текст приглашения, который отображается пользователю перед вводом. Если аргумент не указан, приглашение не выводится.
Возвращаемое значение: строка, введенная пользователем, или false в случае ошибки (например, при чтении после EOF).
Запрос строки без приглашения:
$input = readline();
echo "Вы ввели: $input";Пользователь вводит "Hello" Вы ввели: Hello
Запрос с поясняющим сообщением:
$name = readline("Введите ваше имя: ");
echo "Привет, $name!";Введите ваше имя: Анна Привет, Анна!
Для работы с вводом в CLI доступны другие функции:
fgets(STDIN)- читает строку из стандартного потока ввода. Более низкоуровневый вариант.stream_get_line(STDIN, length, delimiter)- позволяет указать максимальную длину и разделитель.fscanf(STDIN, format)- форматированный ввод данных.
Функция readline() удобнее для интерактивных сценариев с поддержкой истории ввода, в то время как fgets() подходит для простого чтения потока.
Readline в Python
Функция input() аналогична, но всегда выводит приглашение:
name = input("Введите имя: ")
print(f"Привет, {name}")Используется модуль readline с асинхронным API:
const rl = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Введите имя: ', (answer) => {
console.log(`Привет, ${answer}`);
rl.close();
});Readline в MySQL
В консоли MySQL используется команда \G или ; для завершения ввода, но интерактивный ввод строк не имеет прямого аналога.
Функция работает только в CLI. В веб-среде вызов приведет к ошибке или вернет false:
$input = readline("Ввод: "); // Не работает через браузер
var_dump($input);bool(false)
Если расширение не установлено, функция недоступна:
if (!function_exists('readline')) {
echo "Расширение readline не установлено.";
}В PHP 8 существенных изменений в работе функции readline() не произошло. Однако, в PHP 8.1 улучшена обработка ошибок для некоторых расширений, что может затронуть и readline.
В PHP 8.3 также не было изменений специфичных для этой функции.
Цикл для ввода нескольких строк до команды выхода:
$data = [];
while (true) {
$line = readline("Введите строку (или 'стоп'): ");
if ($line === 'стоп') break;
$data[] = $line;
}
print_r($data);Введите строку (или 'стоп'): один
Введите строку (или 'стоп'): два
Введите строку (или 'стоп'): стоп
Array
(
[0] => один
[1] => два
)Использование функций расширения readline для управления историей:
readline_add_history($line1 = readline("Введите первую команду: "));
readline_add_history($line2 = readline("Введите вторую команду: "));
// История доступна при нажатии стрелок вверх
print_r(readline_list_history());Введите первую команду: ls
Введите вторую команду: cd ~
Array
(
[0] => ls
[1] => cd ~
)Проверка на пустую строку:
do {
$input = readline("Введите непустую строку: ");
} while (trim($input) === '');
echo "Вы ввели: $input";Введите непустую строку: Введите непустую строку: текст Вы ввели: текст
Регистрация callback для автодополнения:
function autoComplete($input, $index) {
$commands = ['start', 'stop', 'status'];
return $commands;
}
readline_completion_function('autoComplete');
$cmd = readline("Введите команду: ");