Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Сборщик ключей командной строки
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Приветствую, коллеги,
Думаю, всем нам достаточно часто приходится сталкиваться с запуском PHP-скриптов из CLI (command-line interface) режима. И нередко при этом бывает, что нужно передать скрипту параметры. В PHP есть встроенный массив $_SERVER, ключ argv которого будет содержать всю информацию о параметрах. Однако, если параметры запуска имеют динамичность - например, они генерируются другим скриптом, или же параметров много - возникает проблема с запоминанием очередности передачи параметров, а так же неочевидности назначения этих параметров для вызывающей стороны.
На самом деле, в *nix системах все это давно решено - параметры всех команд именованы и разбиваются на блоки "ключ-значение". Например,
- принимает, по сути, два параметра. Синтаксис таких команд может быть разнообразен, однако к общепринятым я бы отнес:
0. Короткое именование ключа. Синтаксис:
здесь K - имя ключа, обязательно состоящее из одного символа, а value - значение такого ключа, которое, впрочем, может и отсутствовать. В этом случае, как правило, ключ считается булевским и его добавление к параметрам запуска означает "включение опции", за которую он отвечает.
1. Длинное именование ключа. Синтаксис:
key - это длинное наименование ключа, value, как и для короткого ключа - значение.
2. Слияние коротких ключей. Для краткости записи множество коротких ключей допустимо сокращать в "1 слово". Это, однако, отличается от случая 1. - так как синтаксис будет:
- как видно, несмотря на то, что после разделителя идет целое слово, этот разделитель - одиночный, а не двойной, и потому это слово надлежит трактовать как множество ключей, составляющих его буквы.
Исходя из простых описаний выше, можно уже составить некоторый код, который бы помог в разборе переданных параметров. Однако все современные *nix-команды умеют распознавать синонимы своих ключей. Иными словами, некоторые ключи могут иметь синонимы, как краткие, так и полные. Чаще всего бывает, что для каждого краткого ключа есть его полный аналог. Это я так же учел в классе, который представляю ниже:
по-умолчанию разбор ведется из упомянутого уже массива $_SERVER, однако это не обязательно. Массив синонимов передается отдельно, и, если не задан, то не применяется. Кроме того, использование синонимов не влияет на те ключи, синонимы которых не определены - они будут сохранены "как есть". И еще один момент - массив синонимов в себе содержит так же приоритет того, какое значение ключа использовать. Иными словами, наивысший приоритет будет иметь синоним, который указан первым в списке. Пример использования:
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Цитата:
Замечание: Для Windows-платформ эта функция не реализована.
- PHP<5.3
Плюс к этому, она имеет неочевидный интерфейс управления длинными именами параметров (которые еще нужно настраивать заранее, что затрудняет, например, возможность передачи каких угодно, а не предопределенных, параметров). Про синонимы и мечтать не приходится. Отказался.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Мелкий
Отправлено: 18 Февраля, 2013 - 16:01:28
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
//ага, под виндой с 5.3 тоже есть
Но то, что не очень удобна в управлении - да, соглашусь.
----- PostgreSQL DBA
EuGen
Отправлено: 18 Февраля, 2013 - 16:03:41
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Мелкий пишет:
Но то, что не очень удобна в управлении - да, соглашусь.
На самом деле, был вариант изначально и с ней (тогда это все было лишь обрывком кода, затем - функцией). Но - все выросло в те же preg_match и т.п. Так что смысл потерялся. Решил привести в порядок, добавил немного комментариев - и готово.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.