*/ private $options; /** * @var array */ private $flagList; /** * @var array */ private $argumentList; public function __construct(array $params) { $this->options = $params['options'] ?? []; $this->flagList = $params['flagList'] ?? []; $this->argumentList = $params['argumentList'] ?? []; } /** * @return array */ public function getOptions() : array { return $this->options; } /** * @return array */ public function getFlagList() : array { return $this->flagList; } /** * @return array */ public function getArgumentList() : array { return $this->argumentList; } /** * Has an option. */ public function hasOption(string $name) : bool { return array_key_exists($name, $this->options); } /** * Get an option. */ public function getOption(string $name) : ?string { return $this->options[$name] ?? null; } /** * Has a flag. */ public function hasFlag(string $name) : bool { return in_array($name, $this->flagList); } /** * Get an argument by index. */ public function getArgument(int $index) : ?string { return $this->argumentList[$index] ?? null; } public static function fromArgv(array $argv) : self { $argumentList = []; $options = []; $flagList = []; $skipIndex = 2; foreach ($argv as $i => $item) { if ($i < $skipIndex) { continue; } if (strpos($item, '--') === 0 && strpos($item, '=') > 2) { list($name, $value) = explode('=', substr($item, 2)); $name = Util::hyphenToCamelCase($name); $options[$name] = $value; } else if (strpos($item, '--') === 0) { $flagList[] = Util::hyphenToCamelCase(substr($item, 2)); } else if (strpos($item, '-') === 0) { $flagList[] = substr($item, 1); } else { $argumentList[] = $item; } } return new self([ 'argumentList' => $argumentList, 'options' => $options, 'flagList' => $flagList, ]); } }