chh / optparse

易于使用的选项解析器。

v0.1.0 2012-12-19 18:13 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:33:35 UTC


README

安装

1. 获取 composer

2. 将以下内容添加到您的本地 composer.json

{
  "require": {
    "chh/optparse": "*@dev"
  }
}

3. php composer.phar install

示例

hello.php:

<?php

require "vendor/autoload.php";

use CHH\Optparse;

$parser = new Optparse\Parser("Says Hello");

function usage_and_exit()
{
    global $parser;
    fwrite(STDERR, "{$parser->usage()}\n");
    exit(1);
}

$parser->addFlag("help", array("alias" => "-h"), "usage_and_exit");
$parser->addFlag("shout", array("alias" => "-S"));
$parser->addArgument("name", array("required" => true));

try {
    $parser->parse();
} catch (Optparse\Exception $e) {
    usage_and_exit();
}

$msg = "Hello {$parser["name"]}!";

if ($parser["shout"]) {
    $msg = strtoupper($msg);
}

echo "$msg\n";

试试看

% php hello.php Christoph --shout
HELLO CHRISTOPH!

使用

在解析器中,您将定义两件事

  • 标志,以一个或两个短横线开头的参数,被视为程序的选项。
  • 参数,除标志之外的所有内容。

主要关注点在于 CHH\Optparse\Parser,您可以使用它来定义 标志参数

标志

要定义一个标志,将标志的名称传递给 addFlag 方法

<?php

$parser = new CHH\Optparse\Parser;

$parser->addFlag("help");
$parser->parse();

if ($parser["help"]) {
    echo $parser->usage();
    exit;
}

使用 addFlag 定义的标志默认情况下可通过 --$flagName 访问。要为标志定义另一个名称(例如,一个短名称),将名称作为选项数组中 alias 选项的值传递

<?php
$parser->addFlag("help", ["alias" => "-h"]);

这样,help 标志既可通过 --help 也可以 通过 -h 访问。

默认情况下,标志不期望其后面跟随值。要启用此功能,请将标志的 has_value 选项设置为 true

<?php

$parser->addFlag("name", ["has_value" => true]);
$parser->parse(['--name', 'John']);

echo "Hello World {$parser["name"]}!\n";

您可以通过设置 default 选项为标志分配默认值

<?php

$parser->addFlag("pid_file", ["default" => "/var/tmp/foo.pid", "has_value" => true]);

$parser->parse([]);

echo "{$parser["pid_file"]}\n";
// Output:
// /var/tmp/foo.pid

您还可以通过将引用传递到 var 选项中或使用 addFlagVar 方法并将变量传递给它来直接将标志绑定到引用

<?php

$foo = null;
$bar = null;

$parser->addFlag("foo", ["var" => &$foo, "has_value" => true]);
$parser->addFlagVar("bar", $bar, ["has_value" => true]);

$parser->parse(['--foo', 'foo', '--bar', 'bar']);

echo "$foo\n";
echo "$bar\n";
// Output:
// foo
// bar

解析器还支持标志的回调。这些回调作为最后一个参数传递给 addFlag。每当解析器遇到标志时,都会调用回调。它传递对标志值的引用(如果没有值,则为 true)。此用例包括分割字符串或将方法作为标志传递时运行方法

<?php

$parser = new Parser;

function usage_and_exit()
{
    global $parser;
    echo $parser->usage(), "\n";
    exit;
}

$parser->addFlag("help", ['alias' => '-h'], "usage_and_exit");

$parser->addFlag("queues", ["has_value" => true], function(&$value) {
    $value = explode(',', $value);
});

parse 调用需要一个参数数组,或者默认使用 $_SERVER['argv'] 中的参数。当缺少必需的标志或参数时,parse 方法会抛出 CHH\Optparse\ArgumentException,因此请确保捕获此异常并向用户提供一个友好的错误消息。

解析器还能够通过查看定义的标志和参数来为命令生成使用消息。使用 usage 方法检索它。

命名参数

可以通过使用 addArgument 方法添加命名参数,该方法将参数的名称作为第一个参数,然后是一个选项数组。

以下选项支持参数

  • default: 默认值(默认:null)。
  • var_arg: 使此参数为可变长度参数(默认:false)。
  • help: 帮助文本,用于在 usage() 生成的使用消息中描述参数(默认:null)。
  • required: 使此参数为必需,当在参数列表中省略参数时,解析器会抛出异常(默认:false)。

与标志不同,您定义参数的顺序 很重要

可以通过将选项数组中的 var_arg 选项设置为 true 来定义可变长度参数。可变参数只能位于最后一个位置,并且定义在可变参数之后的参数永远不会设置。

<?php

$parser->addArgument("files", ["var_arg" => true]);

// Will always be null, because the value will be consumed by the
// "var_arg" enabled argument.
$parser->addArgument("foo");

$parser->parse(["foo", "bar", "baz"]);

foreach ($parser["files"] as $file) {
    echo $file, "\n";
}
// Output:
// foo
// bar
// baz

参数也可以通过使用argsargslice方法来获取

<?php

$parser->addArgument("foo");
$parser->parse(["foo", "bar", "baz"]);

echo var_export($parser->args());
// Output:
// array("foo", "bar", "baz")

// Can also be used to fetch named arguments:
echo var_export($parser->arg(0));
echo var_export($parser->arg("foo"));
// Output:
// "foo"
// "foo"

// Pass start and length:
echo var_export($parser->slice(0, 2));
// Output:
// array("foo", "bar");

许可证

版权所有(c)2012 Christoph Hochstrasser

特此授权,任何人免费获得此软件及其相关文档副本(以下简称“软件”),在不受限制的情况下处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许获得软件的人进行上述行为,但需遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,还是关于适销性、特定用途的适用性或不侵犯权利的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是在合同行为、侵权行为或其他行为中产生的,无论是在软件中还是在使用或以其他方式处理软件时产生的。