Пишем консольное (CLI) приложение на PHP. Часть 2.

В этой статье мы продолжаем изучать написание консольных 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» в начале.

Ну а на этом все, надеюсь эта статья была вам полезна. А если у вас возникли вопросы — вы можете всегда задать их в комментариях)