Getopt: примеры (PHP)
getopt(string $short_options, array $long_options = [], int &$rest_index = null): array|falseФункция 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
)- $argv: глобальный массив, содержащий все аргументы командной строки. Требует самостоятельного парсинга, но предоставляет полный контроль. Удобен для простых сценариев.
- Symfony Console Component: библиотека для создания сложных CLI-приложений с поддержкой команд, валидации, автодополнения. Рекомендуется для больших проектов вместо ручного использования
getopt(). - Clicomponent от Spatie: альтернативная библиотека для обработки аргументов командной строки с более простым синтаксисом.
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 автоматически генерирует справку и поддерживает типизацию аргументов.
// 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 или mysqldump используют синтаксис --параметр=значение. Аналога getopt() в языке запросов SQL нет.
// Указан обязательный параметр, но значение не передано
$options = getopt("b:");
// Запуск: php script.php -b
// Результат: предупреждение и false// Допустим только -a
$options = getopt("a");
print_r($options);
// Запуск: php script.php -bArray ( )
Неизвестный параметр игнорируется.
// Неправильно: передача значения через пробел для длинного параметра
// Запуск: php script.php --name Alex
$options = getopt("", ["name:"]);
print_r($options);Array ( )
Для длинных параметров значение должно передаваться через =.
- 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// 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// script.php
$options = getopt("a:");
print_r($options);$ php script.php -a first -a second
Array
(
[a] => second
)Для поддержки множественных значений требуется дополнительная логика.
// script.php
$options = getopt("abc");
print_r($options);$ php script.php -abc
Array
(
[a] => false
[b] => false
[c] => false
)Флаги могут объединяться в один аргумент.
$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";