Простой парсер для разбора аргументов командной строки в php. Реализует паттерн «одиночка»
Как с ним работать
Вызываем из консоли скрипт:
1 | $ php script.php --cli=clientname --engine=google --opt -f arg |
На стороне php:
1 2 3 4 5 6 7 8 | $argvParser = G_ArgvParser::getInstance(); try { $cli = $argvParser->getOption('cli'); } catch (Exception $e) { // Throw exception option not found } $isExistFlagF = $argvParser->isExistFlag('f'); $isExistOption = $argvParser->isExistOption('opt'); |
Доступные методы
| getInstance() | Получает экземпляр класса ArgvParser |
| getExecuteFile() | Получает имя вызванного скрипта |
| getOption($key) | Получает значение параметра, а если параметр не существует, возвращает исключение |
| isExistOption($key) | Возвращает булевское значение о существании параметра |
| isExistFlag($key) | Возвращает булевское значение о существании соответствующего флага |
| getArguments() | Получает все агрументы (не путать с параметрами и флагами) |
class ArgvParser
А вот и сам класс:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | <?php class ArgvParserException extends Exception {} /** * Class for parse command line arguments * Singleton * Used function for parser command line args form php.net * @author artur geraschenko */ class ArgvParser { const ENCODING = 'UTF-8'; /** * @var ArgvParser */ private static $instance = null; /** * Saved parsed command line arguments * @var unknown_type */ private $arguments = array(); /** * @return ArgvParser */ public static function getInstance() { if (self::$instance === null) self::$instance = new self(); return self::$instance; } /** * Get executed file name */ public function getExecuteFile() { return (string)$this->arguments['exec']; } /** * Get option from commad line arguments get key * @param string $key */ public function getOption($key) { $key = (string)$key; $this->checkExistOption($key); return $this->arguments['options'][$key]; } /** * Throw exception if option isn't exist * @param unknown_type $key */ private function checkExistOption($key) { if (!$this->isExistOption($key)) throw new ArgvParserException('Option not found'); } /** * Get bool value is exist option * @param bool $key */ public function isExistOption($key) { return isset($this->arguments['options'][$key]); } /** * Get bool value is exist flag * @param bool $key */ public function isExistFlag($key) { return isset($this->arguments['flags'][$key]); } /** * Get all arguments from command line */ public function getArguments() { return (array)$this->arguments['arguments']; } private function __clone(){} private function __construct() { $this->arguments = $this->parseEnvironmentArguments(); } /** * Try to parser environment command line arguments */ private function parseEnvironmentArguments() { $this->checkEnvironmentArguments(); return $this->parseArguments($_SERVER['argv']); } /** * Throw exception if arguments not found is environment ($_SERVER) */ private function checkEnvironmentArguments() { if (!isset($_SERVER['argc']) || !isset($_SERVER['argv']) || (int)$_SERVER['argc'] !== (int)sizeof($_SERVER['argv'])) throw new ArgvParserException("Environment arguments not found"); } /** * Get from php.net and modifed to general format * @url http://www.php.net/manual/en/features.commandline.php#86616 * @param array $args * @return array */ private function parseArguments(array $args) { $ret = array( 'exec' => '', 'options' => array(), 'flags' => array(), 'arguments' => array(), ); $ret['exec'] = array_shift($args); while (($arg = array_shift($args)) != NULL) { if (mb_substr($arg, 0, 2, self::ENCODING) === '--') { $option = mb_substr($arg, 2, mb_strlen($arg) - 2, self::ENCODING); $opt = array(); if (mb_strpos($option, '=', 0, self::ENCODING) !== FALSE) list($opt['key'], $opt['value']) = explode('=', $option, 2); else $opt = array('key' => $option, 'value' => null); $ret['options'][$opt['key']] = $opt['value']; continue; } if (mb_substr($arg, 0, 1, self::ENCODING) === '-') { for ($i = 1; isset($arg[$i]) ; $i++) $ret['flags'][$arg[$i]] = true; continue; } $ret['arguments'][] = $arg; } return $ret; } } |
Похожие статьи:


0 Comments.