Home  >  Article  >  Backend Development  >  Do you know about this PHP command line option parsing library (pflag)?

Do you know about this PHP command line option parsing library (pflag)?

藏色散人
藏色散人forward
2021-10-21 15:21:022195browse

php-toolkit/pflag is a general command line flag (option and parameter) parsing library written in PHP.

Github repository: php-toolkit/pflag(https://github.com/php-toolkit/pflag)

Function Description

  • Common command line options and parameter parser
  • Supports setting value data types (int, string, bool, array), and the input value will be automatically formatted
  • Support setting default values ​​for options/parameters
  • Support setting multiple short names for one option
  • Support reading flag values ​​from environment variables
  • Support Set options/parameters as required (required)
  • Support setting validators to check input values
  • Support automatic rendering of beautiful help information.

Command line options:

  • Options starting with - or --, and The first character must be the letters
  • . Those starting with -- are long options. eg: --long --long value
  • Those starting with - are short options-s -a value
  • Supports defining array options
    • eg: -- tag php --tag go will get $tag = [php, go]

Command line parameters :

  • Anything that does not satisfy the options is recognized as a parameter
  • Supports binding named parameters
  • Supports defining array parameters

Installation

composer Installation

composer require toolkit/pflag

Flags Use

Flags - is a command line flag (options and arguments) Parsers and managers.

For sample code, please see example/Do you know about this PHP command line option parsing library (pflag)?.php

##Create parser

Create and initialize parser

use Toolkit\PFlag\Flags;require dirname(__DIR__) . '/test/bootstrap.php';$flags = $_SERVER['argv'];// NOTICE: must shift first element.$scriptFile = array_shift($flags);$fs = Flags::new();// (可选的)可以添加一些自定义设置$fs->setScriptFile($scriptFile);/** @see Flags::$settings */$fs->setSettings([
    'descNlOnOptLen' => 26]);// ...

Define options

Define options - Define the supported option settings, and the input will be parsed according to the definition during parsing

Example of adding option definition :

use Toolkit\PFlag\Flag\Option;use Toolkit\PFlag\FlagType;use Toolkit\PFlag\Validator\EnumValidator;// add options// - quick add$fs->addOpt('age', 'a', 'this is a int option', FlagType::INT);// - 使用字符串规则快速添加选项定义$fs->addOptByRule('name,n', 'string;this is a string option;true');// -- 一次添加多个选项$fs->addOptsByRules([
    'tag,t' => 'strings;array option, allow set multi times',
    'f'     => 'bool;this is an bool option',]);// - 使用数组定义/** @see Flags::DEFINE_ITEM for array rule */$fs->addOptByRule('name-is-very-lang', [
    'type'   => FlagType::STRING,
    'desc'   => 'option name is to lang, desc will print on newline',
    'shorts' => ['d','e','f'],
    // TIP: add validator limit input value.
    'validator' => EnumValidator::new(['one', 'two', 'three']),]);// - 使用 Option 对象$opt = Option::new('str1', "this is  string option, \ndesc has multi line, \nhaha...");$opt->setDefault('defVal');$fs->addOption($opt);

Define parameters

Define parameters - Define the supported option settings, and the input will be parsed according to the definition during parsing

Add parameter definition Example:

use Toolkit\PFlag\Flag\Argument;use Toolkit\PFlag\FlagType;// add arguments// - quick add$fs->addArg('strArg1', 'the is string arg and is required', 'string', true);// - 使用字符串规则快速添加定义$fs->addArgByRule('intArg2', 'int;this is a int arg and with default value;no;89');// - 使用 Argument 对象$arg = Argument::new('arrArg');// OR $arg->setType(FlagType::ARRAY);$arg->setType(FlagType::STRINGS);$arg->setDesc("this is an array arg,\n allow multi value,\n must define at last");$fs->addArgument($arg);

Parse command line input

Finally call

parse() Parse command line input data

// ...if (!$fs->parse($flags)) {
    // on render help
    return;}vdump($fs->getOpts(), $fs->getArgs());

Show help

When you enter

-h or --help, help information will be automatically rendered.

$ php example/Do you know about this PHP command line option parsing library (pflag)?.php --help
Output:

Do you know about this PHP command line option parsing library (pflag)?

Run the example:

$ php example/Do you know about this PHP command line option parsing library (pflag)?.php --name inhere --age 99 --tag go -t php -t java -d one -f arg0 80 arr0 arr1
Output result:

# 选项数据array(6) {
  ["str1"]=> string(6) "defVal"
  ["name"]=> string(6) "inhere"
  ["age"]=> int(99)
  ["tag"]=> array(3) {
    [0]=> string(2) "go"
    [1]=> string(3) "php"
    [2]=> string(4) "java"
  }
  ["name-is-very-lang"]=> string(3) "one"
  ["f"]=> bool(true)}# 参数数据 
array(3) {
  [0]=> string(4) "arg0"
  [1]=> int(80)
  [2]=> array(2) {
    [0]=> string(4) "arr0"
    [1]=> string(4) "arr1"
  }}

Get the input value

Getting the flag value is very simple. The method is

getOpt(string $name) getArg($nameOrIndex) That is Yes.

TIP: Input values ​​will be automatically formatted by the defined data type

Option data

$force = $fs->getOpt('f'); // bool(true)$age  = $fs->getOpt('age'); // int(99)$name = $fs->getOpt('name'); // string(inhere)$tags = $fs->getOpt('tags'); // array{"php", "go", "java"}

Parameter data

$arg0 = $fs->getArg(0); // string(arg0)// get an array arg$arrArg = $fs->getArg(1); // array{"arr0", "arr1"}// get value by name$arrArg = $fs->getArg('arrArg'); // array{"arr0", "arr1"}

Extension: Rule definition

Option parameter rules. Use rules to quickly define an option or parameter. [Recommended:

PHP Video Tutorial]

    string String rules use semicolons
  • ; to separate each part (full rule: type;desc ;required;default;shorts).
  • array rules are set according to
  • SFlags::DEFINE_ITEM. For the supported type constants, please see FlagType:: *
  • <pre class="brush:php;toolbar:false">use Toolkit\PFlag\FlagType;$rules = [      // v: 只有值,作为名称并使用默认类型 FlagType::STRING      // k-v: 键是名称,值可以是字符串|数组      'long,s',      // name =&gt; rule      'long,a,b' =&gt; 'int;an int option', // long is option name, a and b is shorts.      'f'      =&gt; FlagType::BOOL,      'str1'   =&gt; ['type' =&gt; 'int', 'desc' =&gt; 'an string option'],      'tags'   =&gt; 'array; an array option', // can also: ints, strings      'name'   =&gt; 'type;the description message;required;default', // with desc, default, required]</pre>
  • For options

options allow setting short names

shorts
  • TIP: For example,
long,a,b
-

long is the option name. The remaining a,b are its short option names.

For parameters

The parameters have no aliases or short names

    Array parameters are only allowed to be defined at the end
  • Array definition items

ConstantFlags::DEFINE_ITEM

:

public const DEFINE_ITEM = [
    'name'      => '',
    'desc'      => '',
    'type'      => FlagType::STRING,
    'helpType'  => '', // use for render help
    // 'index'    => 0, // only for argument
    'required'  => false,
    'default'   => null,
    'shorts'    => [], // only for option
    // value validator
    'validator' => null,
    // 'category' => null];

Custom settings

Parsing settings

    // -------------------- 选项解析设置 --------------------

    /**
     * Stop parse option on found first argument.
     *
     * - Useful for support multi commands. eg: `top --opt ... sub --opt ...`
     *
     * @var bool
     */
    protected $stopOnFistArg = true;

    /**
     * Skip on found undefined option.
     *
     * - FALSE will throw FlagException error.
     * - TRUE  will skip it and collect as raw arg, then continue parse next.
     *
     * @var bool
     */
    protected $skipOnUndefined = false;

    // -------------------- 参数解析设置 --------------------

    /**
     * Whether auto bind remaining args after option parsed
     *
     * @var bool
     */
    protected $autoBindArgs = true;

    /**
     * Strict match args number.
     * if exist unbind args, will throw FlagException
     *
     * @var bool
     */
    protected $strictMatchArgs = false;

Rendering help settings

support some settings for render help
    // -------------------- settings for built-in render help --------------------

    /**
     * 自动渲染帮助信息当输入 '-h', '--help' 选项时
     *
     * @var bool
     */
    protected $autoRenderHelp = true;

    /**
     * 在渲染的帮助信息上显示数据类型
     *
     * if False:
     *
     * -o, --opt    Option desc
     *
     * if True:
     *
     * -o, --opt STRING   Option desc
     *
     * @var bool
     */
    protected $showTypeOnHelp = true;

    /**
     * 将在打印帮助消息之前调用它
     *
     * @var callable
     */
    private $beforePrintHelp;

Custom help Message rendering:

$fs->setHelpRenderer(function (\Toolkit\PFlag\FlagsParser $fs) {
    // render help messages});

单元测试

phpunit --debug

test with coverage:

phpdbg -qrr $(which phpunit) --coverage-text

使用pflag的项目

Check out these projects, which use github.com/php-toolkit/pflag :

  • inhere/console Full-featured php command line application library.
  • kite Kite is a tool for help development.
  • More, please see Packagist

Github 仓库: php-toolkit/pflag(https://github.com/php-toolkit/pflag)                                                  

The above is the detailed content of Do you know about this PHP command line option parsing library (pflag)?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:learnku.com. If there is any infringement, please contact admin@php.cn delete