是否有完整的PHP命令行解析器?

时间:2011-07-01 21:08:54

标签: php parsing command-line command-line-interface

我正在寻找类似于Thor的命令解析库,但对于PHP。

更具体地说,我想要一些可以......

  • 处理子命令输入,例如git remote add <url>
  • 将选项与其值相关联,例如my-command --some-option='value'创建了一个键值对,例如array( 'some-option' => 'value' )
  • 从传递给它的配置中生成用法/帮助信息
  • processes -short和--long options
  • 正在维护图书馆
  • 必须是PHP(否则,我会使用Thor)

到目前为止,我所看到的解决方案都没有令人满意。

最接近标记的是PEAR的Console_Getargs,尽管没有维持。

pear命令使用Console_Getopt,但它们执行大量手动处理以实现我前三个要求中的功能。

PHP getopt()无法处理子命令,似乎没有任何其他内置方法可以使用此功能。

是否有符合我可能错过的标准的PHP库?

5 个答案:

答案 0 :(得分:7)

GetOptionKit解析参数,处理子命令,自动生成帮助,并且有一个很好的API。它需要PHP 5.4+。它托管在GitHub上,似乎是活动维护的。

对于布尔选项:

-d   => ["debug" => true]
--debug => ["debug" => true]

对于增量选项:

-v => [ "verbose" => 1 ]
-vv => [ "verbose" => 2 ]
-vvv => [ "verbose" => 3 ]

对于多个值选项:

--foo=bar   => [ "foo" => "bar" ]
--foo=bar --foo=zoo => [ "foo" => ["bar", "zoo"] ]

还有一个类型约束选项可帮助您获得如下选项值:

--output=file  => [ "output" => SplFileInfo Object ]

答案 1 :(得分:6)

答案 2 :(得分:3)

我正在使用这个https://gist.github.com/2959619一段时间取得了相当大的成功。 它很短(约30行),并且支持两个子命令,名为short和long参数。

在较大的项目中使用时,我会推荐组件Symfony Console。它的功能超出了命令行解析,但它很棒。

答案 3 :(得分:3)

Getopt.php符合您的需求。

此外,它真正的面向对象的界面可以帮助您编写优雅的PHP代码。

它是well documented,它没有任何外部依赖关系。

功能

  • 支持短(例如-v)和长(例如--version)选项
  • 选项别名,即。一个选项可以同时拥有长版和短版
  • 折叠的短选项(例如-abc代替-a -b -c
  • 累积选项(例如-vvv
  • 选项可以采用可选或必需的参数
  • 带参数的长选项的两种替代符号:--option value--option=value
  • 末尾有强制性参数的折叠式短期选项(例如。-ab 1而不是-a -b 1

示例代码

<?php

use Ulrichsg\Getopt\Getopt;
use Ulrichsg\Getopt\Option;

$getopt = new Getopt(array(
    new Option('m', 'mode', Getopt::REQUIRED_ARGUMENT),
    new Option('p', 'parents'),
    new Option('v', 'verbose'),
    new Option('Z', 'context', Getopt::REQUIRED_ARGUMENT),
    new Option(null, 'help'),
    new Option(null, 'version')
));

try {
    $getopt->parse();

    if ($getopt['version']) {
        echo "Getopt example v0.0.1\n";
        exit(0);
    }

    // Error handling and --help functionality omitted for brevity

    $createParents = ($getopt['parents'] > 0);
    // Note that these are null if the respective options are not given
    $mode = $getopt['mode'];
    $context = $getopt['context'];

    $dirNames = $getopt->getOperands();

    makeDirectories($dirNames, $createParents, $mode, $context);
} catch (UnexpectedValueException $e) {
    echo "Error: ".$e->getMessage()."\n";
    echo $getopt->getHelpText();
    exit(1);
}

答案 4 :(得分:2)

如果somone正在寻找具有以下功能的独立于框架的解决方案:

  • 简单定义语法
  • 支持长短名称
  • 支持重复参数(例如-v -v -v)
  • 支持多个短参数(例如-abc vs -a -b -c)
  • 支持两种设置值的方法(例如--name = abc或--name abc)
  • 支持尾随值的双破折号分隔符
  • 构建使用定义

我建议使用此产品https://github.com/webtrendi/clapp