Класс для аргументов командной строки

Discussion in 'PHP' started by ckpunmkug, 8 Apr 2019.

  1. ckpunmkug

    ckpunmkug Member

    Joined:
    20 Mar 2017
    Messages:
    24
    Likes Received:
    10
    Reputations:
    1
    Очень простой в применении, но тем не менее очень эффективный класс для работы с аргументами командной строки.

    Всегда запаривало делать хэлпник к консольному скрипту, наконец нашел простое решение для приёма параметров и что бы для них было легко задать короткие и длинные дефисные имена, описание, возможность быть флагом или параметром, быть обязательным или нет.

    Смотрите пример. Запуск php cli.php -h

    Класс Args.php
    Code:
    <?php
    class Args {
    	static $description = "";
    	static $config = [];
    	static function help() {
    		$text = "";
    		if (!empty(self::$description))
    			$text .= "\n".self::$description."\n\n";
    		$text .= "Usage: \n";
    		foreach (self::$config as $config) {
    			$text .= "  {$config[0]} {$config[1]}";
    			if ($config[2] !== null) {
    				$text .= " {$config[2]}\t\t{$config[3]}\n";
    			} else {
    				$text .= "\t\t\t{$config[3]}\n";
    			}
    		}
    		echo $text."\n";
    	}
    	static function apply() {
    		self::add();
    		global $argv;
    		array_walk(self::$config, function(array $config, int $index, array $argv) {
    			$c = count($argv);
    			for ($i = 1; $i < $c; $i++) {
    				if ($argv[$i] == $config[0] || $argv[$i] == $config[1]) {
    					if ($config[2] !== null) {
    						if (!isset($argv[($i+1)])) {
    							trigger_error("\"{$config[2]}\" is not set for \"{$config[0]}\" in command line", E_USER_ERROR);
    							exit(255);
    						}
    						$i += 1;
    						self::$config[$index][4]($argv[$i]);
    						return null;
    					} else {
    						self::$config[$index][4]();
    						return null;
    					}
    				}
    			}
    			if (self::$config[$index][5]) {
    				trigger_error("\"{$config[0]}\" is not set in command line", E_USER_ERROR);
    				exit(255);
    			}
    		}, $argv);
    		if (!defined('VERBOSE'))
    			define('VERBOSE', true);
    		if (!defined('DEBUG'))
    			define('DEBUG', false);
    	}
    	static function add(array $config = []) {
    		if (!empty($config)) {
    			array_push(self::$config, $config);
    			return null;
    		}
    		self::add([
    			'-q', '--quiet', null, "Do not output anything", 
    			function() {
    				define('VERBOSE', false);
    			}, false
    		]);
    		self::add([
    			'-d', '--debug', null, "Run in debug mode", 
    			function() {
    				define('DEBUG', true);
    			}, false
    		]);
    		array_unshift(self::$config, [
    			'-h', '--help', null, "Show help text and exit",
    			function() {
    				self::help();
    				exit(0);
    			}, false
    		]);
    	}
    }
    
    Пример cli.php
    Code:
    <?php
    require "Args.php";
    
    Args::$description = "Program description";
    
    Args::add([
    	'-o', '--optional', null, "Optional flag", 
    	function() {
    		define('OPTIONAL', true);
    	}, false
    ]);
    
    Args::add([
    	'-r', '--required', null, "Required flag", 
    	function() {
    		define('REQUIRED', true);
    	}, true
    ]);
    
    Args::add([
    	'-O', '--optional_parameter', 'PARAMETER', "Optional with parameter", 
    	function(string $parameter) {
    		echo "Optional parameter: {$parameter}\n";
    	}, false
    ]);
    
    Args::add([
    	'-R', '--required_parameter', 'PARAMETER', "Required with parameter", 
    	function(string $parameter) {
    		echo "Required parameter: {$parameter}\n";
    	}, true
    ]);
    
    Args::apply();
    
    По умолчанию константы DEBUG=false VERBOSE=true. Встроенные флаги меняют их значение.
     
  2. barnaki

    barnaki Level 8

    Joined:
    2 Nov 2008
    Messages:
    667
    Likes Received:
    112
    Reputations:
    4
  3. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    1,885
    Likes Received:
    710
    Reputations:
    198
    _________________________
    pas9x likes this.
  4. failsafe

    failsafe Member

    Joined:
    1 Apr 2016
    Messages:
    21
    Likes Received:
    8
    Reputations:
    1
    Причем тут шаблон проектирования Команда? Если кто то и реализовал с помощью этого шаблона описанную выше задачу - ну замечательно , но это частный случай, и в общем эти вещи никак не связаны
     
    ckpunmkug likes this.
Loading...