Readline: примеры (PHP)

Интерактивный ввод данных через readline в PHP
Раздел: Ввод данных
readline(string $prompt = ?): string|false
Основы функции readline

Функция readline() в PHP предназначена для интерактивного чтения строки ввода из командной строки (CLI). Она обычно используется в скриптах, требующих взаимодействия с пользователем через терминал.

Аргументы функции

Функция принимает один необязательный аргумент:

  • prompt (string) - текст приглашения, который отображается пользователю перед вводом. Если аргумент не указан, приглашение не выводится.

Возвращаемое значение: строка, введенная пользователем, или false в случае ошибки (например, при чтении после EOF).

Простые примеры использования
Базовый вызов

Запрос строки без приглашения:

$input = readline();
echo "Вы ввели: $input";
Пользователь вводит "Hello"
Вы ввели: Hello
С текстовым приглашением

Запрос с поясняющим сообщением:

$name = readline("Введите ваше имя: ");
echo "Привет, $name!";
Введите ваше имя: Анна
Привет, Анна!
Альтернативы в PHP

Для работы с вводом в CLI доступны другие функции:

  • fgets(STDIN) - читает строку из стандартного потока ввода. Более низкоуровневый вариант.
  • stream_get_line(STDIN, length, delimiter) - позволяет указать максимальную длину и разделитель.
  • fscanf(STDIN, format) - форматированный ввод данных.

Функция readline() удобнее для интерактивных сценариев с поддержкой истории ввода, в то время как fgets() подходит для простого чтения потока.

Аналоги в других языках

Readline в Python

Функция input() аналогична, но всегда выводит приглашение:

name = input("Введите имя: ")
print(f"Привет, {name}")
JavaScript (Node.js)

Используется модуль 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)
Отсутствие расширения readline

Если расширение не установлено, функция недоступна:

if (!function_exists('readline')) {
    echo "Расширение readline не установлено.";
}
Изменения в PHP 8

В PHP 8 существенных изменений в работе функции readline() не произошло. Однако, в PHP 8.1 улучшена обработка ошибок для некоторых расширений, что может затронуть и readline.

В PHP 8.3 также не было изменений специфичных для этой функции.

Расширенные примеры
Чтение нескольких значений

Цикл для ввода нескольких строк до команды выхода:

Пример php
$data = [];
while (true) {
    $line = readline("Введите строку (или 'стоп'): ");
    if ($line === 'стоп') break;
    $data[] = $line;
}
print_r($data);
Введите строку (или 'стоп'): один
Введите строку (или 'стоп'): два
Введите строку (или 'стоп'): стоп
Array
(
    [0] => один
    [1] => два
)
Сохранение истории ввода

Использование функций расширения readline для управления историей:

Пример php
readline_add_history($line1 = readline("Введите первую команду: "));
readline_add_history($line2 = readline("Введите вторую команду: "));
// История доступна при нажатии стрелок вверх
print_r(readline_list_history());
Введите первую команду: ls
Введите вторую команду: cd ~
Array
(
    [0] => ls
    [1] => cd ~
)
Обработка пустого ввода

Проверка на пустую строку:

Пример php
do {
    $input = readline("Введите непустую строку: ");
} while (trim($input) === '');
echo "Вы ввели: $input";
Введите непустую строку: 
Введите непустую строку: текст
Вы ввели: текст
Использование callback-функций

Регистрация callback для автодополнения:

Пример php
function autoComplete($input, $index) {
    $commands = ['start', 'stop', 'status'];
    return $commands;
}
readline_completion_function('autoComplete');
$cmd = readline("Введите команду: ");

PHP readline function comments

En
Readline Reads a line