В этой статье мы продолжаем изучать написание консольных CLI приложений на php. Сегодня мы рассмотрим более удобный способ получения аргументов приложения — с помощью функции getopt(). Разберемся с пользовательским вводом и начнем изучать форматирование вывода в консоль.
Получение значений аргументов с помощью getopt()
В прошлой части статьи, для получения аргументов, мы написали простой парсер из глобальной переменной $argv. Но для более простого и элегантного решения этой задачи можно использовать функцию getopt():
getopt(string $short_options, array $long_options = [], int &$rest_index = null): array|false
Параметрами функции являются: строка $short_options, массив $long_options, переменная $rest_index.
Через $short_options можно передать параметры, состоящие из одного символа, значение которых нужно получить. В консоли перед ними ставится одинарный дефис, например: «-a». В массиве $long_options можно передать строковые параметры, состоящие из одного или более символов. Перед ними ставится двойной дефис, например: «—opt». Если задан параметр &$rest_index, то индекс, на котором остановился разбор, будет записан в него. После выполнения, функция возвращает ассоциативный массив аргументов функции или, если аргументов нет, возвращает false.
Теперь, давайте более подробно рассмотрим строку $short_options и массив $long_options:
Строка $short_options может содержать следующее:
- Отдельные символы. Пример «o». Они указывают на параметры не имеющие значений.
- Символы, за которыми следует двоеточие. Пример «o:». Они указывают на параметры требующие значения.
- Символы, за которыми следует два двоеточия. Пример «o::». Они указывают на параметры, значение которых необязательно.
Элементами массива $long_options могут являться:
- Строка. Пример: [‘opt’]. Она указывает на параметр не имеющий значений.
- Строка, за которой следует двоеточие. Пример: [‘opt:’]. В таком случае параметр требует значение.
- Строка, за которой следует два двоеточия. Пример: [‘opt::’]. Она указывает на параметр, значение которого необязательно.
Вот несколько примеров использования функции getopt().
В первом примере мы попробуем получить и вывести обязательное значение аргументов «a», «b» и «c». Для этого напишем следующий код:
<?php
print_r(getopt('a:b:c:'));
Проверим его работу:
shell>php cli.php -a 1 -b 2 -c 3
Array
(
[a] => 1
[b] => 2
[c] => 3
)
Теперь попробуем получить обязательное значение аргументов, но на этот раз они будут строковыми, а следовательно мы запишем их как элементы массива $long_options:
<?php
print_r(getopt('', ['opt1:', 'opt2:', 'opt3:']));
Для проверки работы скрипта, передадим ему аргументы, но раз они строковые, нам нужно писать два «-» перед ними:
shell>php cli.php --opt1 a --opt2 b --opt3 c
Array
(
[opt1] => a
[opt2] => b
[opt3] => c
)
Пользовательский ввод
До этого мы передавали информацию в наше приложение только при его запуске, с помощью аргументов. Такой подход может быть удобен для создания консольных скриптов, которым требуются только первоначальные параметры для осуществления какого-либо действия. Это не позволяет взаимодействовать с пользователем во время выполнения приложения. Чтобы решить эту задачу, можно использовать функцию:
readline(?string $prompt = null): string|false
Эта функция запрашивает пользовательский ввод и читает одну строку, введённую пользователем. Вот пример ее использования:
<?php
$line = readline('Введите любую строку: ');
echo $line;
Запустим наше приложение и введем любую строку:
shell>php cli.php
Введите любую строку: Любая строка...
Любая строка...
Приложение вернет нашу строку.
Перенос строки
Просто вывести текст в консоль можно через echo:
<?php
echo "Какой-то текст";
Но что, если мы захотим вывести две строки?
<?php
echo "1 строка";
echo "2 строка";
Хоть команды echo и записаны на разных строках в программе, при выводе текст все равно будет на одной строке:
shell>php cli.php
1 строка2 строка
Чтобы решить эту задачу, нам нужно использовать управляющий символ переноса строки: «\n». Поставим его в конец первой строки:
<?php
echo "1 строка\n";
echo "2 строка";
Теперь строки расположены как нам надо:
shell>php cli.php
1 строка
2 строка
На этом 2 часть подошла к концу. В следующей, заключительной, части мы рассмотрим форматирование текста и сделаем вывод нашей программы красивее. А также научимся запускать приложение без «php» в начале.
Ну а на этом все, надеюсь эта статья была вам полезна. А если у вас возникли вопросы — вы можете всегда задать их в комментариях)