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

Использование readline_info для настройки ввода в PHP
Раздел: Ввод данных
readline_info(?string $var_name = null, mixed $value = null): mixed

Описание функции readline_info

Назначение

Функция readline_info в PHP предоставляет интерфейс для получения и изменения различных параметров библиотеки GNU Readline или Libedit, которые используются для интерактивного ввода данных в командной строке. Основное применение — создание интерактивных CLI-скриптов с возможностью редактирования строки, автодополнения и работы с историей ввода.

Аргументы и возвращаемое значение

Функция имеет переменную сигнатуру: readline_info(?string $var_name = null, mixed $value = null): mixed.

  • $var_name (string|null): Имя настраиваемой переменной. Если передано null, функция возвращает ассоциативный массив со всеми текущими настройками.
  • $value (mixed): Значение, которое нужно установить для указанной переменной. Если не указано, функция возвращает текущее значение переменной $var_name. Если указано, значение устанавливается и возвращается предыдущее значение этой переменной.

Возвращаемое значение зависит от переданных аргументов: массив всех настроек, значение конкретной настройки или предыдущее значение после установки нового.

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

Получение всех текущих настроек
<?php
$info = readline_info();
print_r($info);
?>
Array
(
    [line_buffer] =>
    [point] => 0
    [end] => 0
    [marked] => 0
    [done] => 0
    [pending_input] => 0
    [prompt] =>
    [terminal_name] => xterm-256color
    [completion_append_character] =>
    [completion_suppress_append] =>
    [library_version] => 7.0
    [readline_name] =>
    [attempted_completion_over] => 0
)
Получение значения конкретного параметра
<?php
$prompt = readline_info('prompt');
echo "Текущий промпт: ";
var_dump($prompt);
?>
Текущий промпт: string(0) ""
Установка нового значения параметра
<?php
// Устанавливаем символ для автодополнения и получаем старое значение
$oldChar = readline_info('completion_append_character', ' ');
echo "Старый символ дополнения: '" . $oldChar . "'\n";
// Проверяем новое значение
$newChar = readline_info('completion_append_character');
echo "Новый символ дополнения: '" . $newChar . "'\n";
?>
Старый символ дополнения: ''
Новый символ дополнения: ' '
Похожие функции в PHP
fgets и stream_get_line

Функции fgets(STDIN) или stream_get_line(STDIN, 1024) читают строку из стандартного ввода, но без поддержки истории, редактирования строки или автодополнения. Используются, когда функционал Readline избыточен или библиотека недоступна.

readline

Основная функция readline(?string $prompt = null): string|false напрямую читает строку с использованием библиотеки, поддерживая все её возможности. readline_info служит вспомогательным инструментом для конфигурации.

Альтернативы в других языках
Python: модуль readline

В Python аналогичный функционал предоставляет модуль readline, являющийся оберткой над той же библиотекой. Для получения и установки параметров используются функции get_completer_delims(), set_completer_delims() или прямое обращение к readline.parse_and_bind().

import readline
readline.set_completer_delims(' \t\n;')
print(readline.get_completer_delims())
 \t\n;
JavaScript (Node.js): модуль readline

В Node.js модуль readline предоставляет интерфейс для чтения потока ввода. Конфигурация происходит через параметры объекта Interface, а не через единую функцию.

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'NODE> '
});
console.log(rl.getPrompt()); // Получить текущий промпт
MySQL: READLINE (клиент)

Клиент MySQL может использовать библиотеку Readline, но управление её параметрами обычно осуществляется через файлы конфигурации вроде ~/.inputrc, а не средствами самого SQL.

Типичные ошибки
Использование при недоступной библиотеке readline

Если расширение readline не установлено или библиотека недоступна, функция вернет null или вызовет предупреждение.

<?php
if (!function_exists('readline_info')) {
    echo "Расширение readline недоступно.\n";
}
?>
Передача несуществующего имени переменной

При запросе несуществующей настройки функция вернет null.

<?php
$result = readline_info('non_existent_setting');
var_dump($result);
?>
NULL
Некорректный тип аргумента

Передача аргумента $var_name не в строковом формате может привести к неожиданному поведению.

<?php
$result = readline_info(123); // Ожидается string или null
var_dump($result);
?>
NULL
Изменения в версиях PHP
  • PHP 8.2.0: Добавлена возможность изменения параметра completion_append_character через readline_info(). Ранее его можно было только читать.
  • PHP 8.0.0: Параметр $var_name и возвращаемое значение теперь допускают значение null. Удален устаревший параметр prompt_old.

Расширенные примеры

Динамическое изменение промпта

Промпт можно менять в процессе выполнения скрипта в зависимости от контекста.

Пример php
<?php
readline_info('prompt', 'Введите команду: ');
$input1 = readline();
readline_info('prompt', 'Введите аргумент: ');
$input2 = readline();
echo "Вы ввели: $input1 $input2\n";
?>
Работа с историей и дополнением

Использование readline_info() совместно с другими функциями readline для создания кастомного поведения.

Пример php
<?php
// Устанавливаем кастомный символ завершения автодополнения
readline_info('completion_append_character', '');
function myCompleter($input, $index) {
    $options = ['apple', 'apricot', 'banana'];
    return array_filter($options, function($item) use ($input) {
        return str_starts_with($item, $input);
    });
}
readline_completion_function('myCompleter');
$fruit = readline('Выберите фрукт: ');
echo "Вы выбрали: $fruit\n";
?>
Сброс состояния ввода

Параметр line_buffer содержит текущую неотправленную строку. В определенных сценариях это может быть полезно для сброса.

Пример php
<?php
// Начинаем ввод, но не отправляем (например, в обработчике сигнала)
// Эмулируем наличие буфера
readline_info('line_buffer', 'частичный ввод');
$buffer = readline_info('line_buffer');
echo "Текущий буфер: $buffer\n";
// Сброс буфера
readline_info('line_buffer', '');
?>
Текущий буфер: частичный ввод
Определение и изменение версии библиотеки

Информация о библиотеке доступна только для чтения.

Пример php
<?php
$libVersion = readline_info('library_version');
echo "Используется библиотека версии: $libVersion\n";
// Попытка изменить версию не повлияет на реальное значение
$old = readline_info('library_version', '8.1');
echo "'Старая версия': $old\n";
echo "Реальная версия: " . readline_info('library_version') . "\n";
?>
Используется библиотека версии: 7.0
'Старая версия': 7.0
Реальная версия: 7.0

PHP readline_info function comments

En
Readline info Gets/sets various internal readline variables