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

Обработка аргументов командной строки с помощью getopt
Раздел: Аргументы командной строки
getopt(string $short_options, array $long_options = [], int &$rest_index = null): array|false
Основы функции getopt в PHP

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

Аргументы функции
  • short_options: строка, содержащая список допустимых однобуквенных параметров. Параметр, за которым следует двоеточие (:), ожидает значение. Двойное двоеточие (::) указывает на необязательное значение.
  • long_options: массив, содержащий список допустимых длинных параметров. Для указания обязательного значения после имени параметра ставится двоеточие (:), для необязательного — двойное двоеточие (::).
  • rest_index: начиная с PHP 7.1, этот аргумент позволяет получить индекс в массиве $argv, начиная с которого идут параметры, не обработанные getopt().

Функция возвращает ассоциативный массив с разобранными параметрами или false при ошибке.

Простые примеры использования
Обработка коротких флагов

Скрипт принимает флаги -a и -b, причем -b требует значение.

// script.php
$options = getopt("ab:");
print_r($options);

Запуск и результат:

$ php script.php -a -b test
Array
(
    [a] => false
    [b] => test
)
Работа с длинными параметрами
// script.php
$options = getopt("", ["name:", "age::"]);
print_r($options);
$ php script.php --name=Alex --age=30
Array
(
    [name] => Alex
    [age] => 30
)

$ php script.php --name=Alex
Array
(
    [name] => Alex
)
Похожие функции в PHP
  • $argv: глобальный массив, содержащий все аргументы командной строки. Требует самостоятельного парсинга, но предоставляет полный контроль. Удобен для простых сценариев.
  • Symfony Console Component: библиотека для создания сложных CLI-приложений с поддержкой команд, валидации, автодополнения. Рекомендуется для больших проектов вместо ручного использования getopt().
  • Clicomponent от Spatie: альтернативная библиотека для обработки аргументов командной строки с более простым синтаксисом.
Аналоги в других языках
Python: модуль argparse
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--name', required=True)
parser.add_argument('-a', '--age', type=int)
args = parser.parse_args()
print(args.name, args.age)
$ python script.py -n Alex -a 30
Alex 30

В отличие от getopt(), argparse автоматически генерирует справку и поддерживает типизацию аргументов.

JavaScript: библиотека yargs
// script.js
const yargs = require('yargs');
const argv = yargs.option('n', {
    alias: 'name',
    demandOption: true,
    type: 'string'
}).argv;
console.log(argv.name);
$ node script.js -n Alex
Alex
MySQL: параметры командной строки утилит

Утилиты типа mysql или mysqldump используют синтаксис --параметр=значение. Аналога getopt() в языке запросов SQL нет.

Типичные ошибки
Неверная спецификация параметров
// Указан обязательный параметр, но значение не передано
$options = getopt("b:");
// Запуск: php script.php -b
// Результат: предупреждение и false
Передача недопустимого параметра
// Допустим только -a
$options = getopt("a");
print_r($options);
// Запуск: php script.php -b
Array
(
)

Неизвестный параметр игнорируется.

Смешение стилей
// Неправильно: передача значения через пробел для длинного параметра
// Запуск: php script.php --name Alex
$options = getopt("", ["name:"]);
print_r($options);
Array
(
)

Для длинных параметров значение должно передаваться через =.

Изменения в последних версиях PHP
  • PHP 7.1.0: добавлен третий аргумент $rest_index.
  • PHP 8.0.0: функция больше не возвращает false при разборе опций без аргументов. В случае ошибки выбрасывается исключение ValueError.
// До PHP 8.0
$options = getopt("a:", []); // Некорректная спецификация
var_dump($options); // bool(false)

// Начиная с PHP 8.0
$options = getopt("a:", []); // Выбрасывается ValueError
Расширенные примеры
Использование rest_index
Пример php
// script.php
$rest_index = null;
$options = getopt("a:b:", [], $rest_index);
print_r($options);
echo "Индекс неразобранных аргументов: $rest_index\n";
if ($rest_index !== null) {
    echo "Прочие аргументы: " . implode(", ", array_slice($argv, $rest_index));
}
$ php script.php -a 1 -b 2 file1.txt file2.txt
Array
(
    [a] => 1
    [b] => 2
)
Индекс неразобранных аргументов: 5
Прочие аргументы: file1.txt, file2.txt
Обработка массива значений
Пример php
// script.php
$options = getopt("a:");
print_r($options);
$ php script.php -a first -a second
Array
(
    [a] => second
)

Для поддержки множественных значений требуется дополнительная логика.

Комбинирование коротких флагов
Пример php
// script.php
$options = getopt("abc");
print_r($options);
$ php script.php -abc
Array
(
    [a] => false
    [b] => false
    [c] => false
)

Флаги могут объединяться в один аргумент.

Валидация и применение
Пример php
$options = getopt("u:p:h:", ["url:", "port::"]);

// Установка значений по умолчанию
$url = $options['url'] ?? $options['u'] ?? 'localhost';
$port = $options['port'] ?? $options['p'] ?? 80;

if (isset($options['h']) || isset($options['help'])) {
    echo "Справка по использованию скрипта\n";
    exit(0);
}

echo "Подключение к $url:$port\n";

PHP getopt function comments

En
Getopt Gets options from the command line argument list