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";
?>Старый символ дополнения: '' Новый символ дополнения: ' '
Функции fgets(STDIN) или stream_get_line(STDIN, 1024) читают строку из стандартного ввода, но без поддержки истории, редактирования строки или автодополнения. Используются, когда функционал Readline избыточен или библиотека недоступна.
Основная функция readline(?string $prompt = null): string|false напрямую читает строку с использованием библиотеки, поддерживая все её возможности. readline_info служит вспомогательным инструментом для конфигурации.
В 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;
В 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, но управление её параметрами обычно осуществляется через файлы конфигурации вроде ~/.inputrc, а не средствами самого SQL.
Если расширение 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 8.2.0: Добавлена возможность изменения параметра
completion_append_characterчерезreadline_info(). Ранее его можно было только читать. - PHP 8.0.0: Параметр
$var_nameи возвращаемое значение теперь допускают значениеnull. Удален устаревший параметрprompt_old.
Расширенные примеры
Промпт можно менять в процессе выполнения скрипта в зависимости от контекста.
<?php
readline_info('prompt', 'Введите команду: ');
$input1 = readline();
readline_info('prompt', 'Введите аргумент: ');
$input2 = readline();
echo "Вы ввели: $input1 $input2\n";
?>Использование readline_info() совместно с другими функциями readline для создания кастомного поведения.
<?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
// Начинаем ввод, но не отправляем (например, в обработчике сигнала)
// Эмулируем наличие буфера
readline_info('line_buffer', 'частичный ввод');
$buffer = readline_info('line_buffer');
echo "Текущий буфер: $buffer\n";
// Сброс буфера
readline_info('line_buffer', '');
?>Текущий буфер: частичный ввод
Информация о библиотеке доступна только для чтения.
<?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