aidantwoods/betteroptions

v0.0.0 2017-02-20 22:43 UTC

This package is auto-updated.

Last update: 2024-09-19 09:24:08 UTC


README

getopt() 更好

概述

getopt() 很糟糕。标志(无值的选项)被设置为 当它们被设置时 为假,用户未设置的选项如果在尝试查找时会导致键错误。如果指定了多个选项,则会提供一个包含所有这些选项的数组,无论您是否想要接收一个数组。

无法指定期望的类型。如果用户未指定强制选项,这将阻止其他强制选项被解析,(但不会强制这些选项存在)。"长"选项以数组形式指定,而"短"选项通过连接字符串...

这意味着为了接受命令行选项,必须手动编写大量的丑陋的验证逻辑。而且使用"长"和"短"选项会创建不必要的代码来特别处理那些在功能上没有区别的配置。

相反,创建一个数据结构文件,指定选项的逻辑(AND、OR、XOR)要求组,或者只需指定选项而不指定要求。

我之所以说"数据结构文件",是因为,从理论上讲,你可以使用任何你喜欢的(只要你创建了一个实现正确接口的适配器并注册了文件扩展名)。默认支持文件类型是JSON(使用PHP的本地解析器),以及YAML(如果您还安装了Symfony的YAML解析器,可以从composer.json中的require dev部分安装)。

可以指定选项的期望类型,这将是你将接收的类型(如果未设置,则为null)。可以指定默认值(你仍然可以查询用户是否设置了变量或默认值被加载,而不需要将默认值硬编码在比较中)。

如果不期望多个选项,则不会得到数组。如果您想接受多个选项,但也可以很好地处理单个选项,则可以接收一个包含单个项目的数组(例如string[]bool[]integer[]是包含特定类型的数组)。

您还可以在数据结构文件中记录选项,并指定是否希望使用"长"选项或"短"选项(两个或一个短横线)而无需更改指定结构。

还可以定义别名(例如 --file-f)。您可以创建任意多个(尽管两个几乎总是足够的)。

如果组的逻辑条件失败,您可以接收响应,这样您就不必自己编写错误消息,您甚至可以使用自动生成的帮助屏幕,其中包含来自数据结构文件的每个选项的描述。

示例

使用示例中的命令行选项配置 options.json/options.yamlexample.php 中的代码,可以实现以下功能

$ php example.php --foo=asda --foo=sdsg --bar=dsgs
foo:
array(2) {
  [0]=>
  string(4) "asda"
  [1]=>
  string(4) "sdsg"
}

bar:
string(4) "dsgs"

baz:
NULL

boo:
NULL

help:
NULL

如果我们把 options.json/options.yaml 中 --foo 的类型从 string[] 改为 string,我们可以得到以下结果

foo:
string(4) "asda"

(返回配置的第一个值)。

如果我们只是调用

$ php example.php

那么基于数据文件中设置的逻辑组自动生成的对不完整性的响应如下

At least one of {--foo or --bar or {--baz xor --boo}} must be set

使用自动生成的帮助屏幕(我们在示例代码中将此绑定到 --help),我们可以使用

$ php example.php --help

获取以下内容

--foo, -fooalias        Foo.
--bar
--baz                   Lorem ipsum dolor sit amet, consectetur adipiscing
                        elit. Ut fermentum tristique enim quis consequat.
                        Sed dignissim mi in erat gravida, sed interdum
                        mauris iaculis. Quisque nulla dolor, sollicitudin
                        quis pretium non, venenatis eu tortor. Mauris eget
                        enim leo. Etiam pretium semper leo, eu elementum
                        lacus luctus in. Cras elit ex, rhoncus ac gravida
                        ac, pulvinar porttitor sapien. Ut vel purus
                        sollicitudin, finibus est ac, imperdiet elit. Ut
                        sollicitudin at nunc et dapibus.

--boo
--help                  Print this help dialogue