net_bazzline/php_component_cli_arguments
免费(在自由的意义上)的php命令行参数薄封装,简化使用和验证过程
Requires
- php: ~8.0
Requires (Dev)
- phpunit/phpunit: ~9.0
README
本项目旨在提供一款易于使用且免费(在自由的意义上)的PHP命令行组件。
请访问openhub.net。
当前变更日志可以在这里找到。
安装
手动安装
mkdir -p vendor/net_bazzline/php_component_cli_arguments cd vendor/net_bazzline/php_component_cli_arguments git clone https://github.com/bazzline/php_component_cli_arguments .
通过Packagist
composer require net_bazzline/php_component_cli_arguments:dev-master
优势
- 简化以下类型参数的处理
- 标志(命令 -f|--force)
- 列表(命令 --foobar=foo | 命令 -f=foo)
- 值(命令 )
示例
通过以下示例中所示的众多参数调用run.php。
php run.php --foo bar --foobar=foo --foobar="bar" -f="foo" -f=bar -b foobar foo -flag
生成以下输出。
arguments provided:
--foo
bar
--foobar=foo
--foobar=bar
-f=foo
-f=bar
-b
foobar
foo
-flag
flags provided:
foo
b
f
l
a
g
lists provided:
foobar
foo
bar
f
foo
bar
values provided:
bar
foobar
foo
术语
所有参数都分为三种类型之一:标志、列表或值。 参数或参数?我无法找到主要区别。当我想到参数时,我的思维就会滑到方法或函数的领域,这就是我决定称它们为参数的原因。此外,php.net也将“参数列表”称为参数。
标志
标志是一种可以改变命令行为的参数。它作为触发器,您可以打开或关闭某些功能(世界上最好的例子是“-h|--help”)
标志在命令调用中的位置不重要,只看是否存在。
有效的标志有
- -f
- --flag
- -flag(-f -l -a -g的快捷方式)
列表
列表是一个包含每个名称多个值的参数。
这次调用
php example.php --my_list="argument one" --my_list="argument two"
将生成一个名为 "my_list" 的列表和两个参数,"参数一" 和 "参数二"。
列表是最复杂的参数。就像标志一样,列表在命令调用中的位置不重要。
有效的列表有
- -l=value
- -l="val ue"
- --list=value
- --list="val ue"
值
值是直接的参数。你只需将它们传递给你的命令。与标志或列表不同,位置很重要。
有效的值有
- value
- "val ue"
php example.php "value one" "value two"
第一个值的内容是 "value one",第二个值的内容是 "value two"。
php example.php "value two" "value one"
第一个值的内容是 "value two",第二个值的内容是 "value one"。
短名称和长名称表示法
支持短名称("-f")和长名称("--foo")表示法的标志和列表参数。短名称由单个"-"表示,而长名称由双"-"表示。它们的使用和处理是领域特定的(也是一项主观问题)。合并列表的使用和内容不是本组件的一部分。
为什么没有验证?
验证是一个复杂的话题。这就是我决定不将其放入此组件领域的原因。
它会使代码本身复杂化。我会创建一个通用的验证接口,这会使使用此组件的速度减慢。此外,您将不得不学习一种验证表达式语言,或者需要编写适合我的验证接口但不符合您“编码方式”的代码。
最后,验证到底是什么?
- 检查是否传递了参数(标志、列表、值)
- 如果是传递的,则验证值或如果在此情况下允许(例如,同时传递标志"-f"和"-b"是否正确使用等)
- 如果没有传递但必需,则创建特定的消息或抛出异常(对于可选参数也是如此)
总之,验证本身和错误处理是领域特定的。这就是为什么我决定不支持它深入。该组件通过"hasLists()"、"hasList($name)"等方法支持您的验证实现。
由于我不会说“永不言弃”,如果您有一个聪明的想法或方法来简化验证,我欢迎提问或拉取请求。
关于可选参数怎么办?
可选参数与验证有相同的问题。用优雅的方式实现并不容易。它是非常特殊/领域特定的(例如,如果使用标志"--xyz",则参数是可选的,否则是必需的)。您的代码无论如何都需要注意参数是否传递。使用可用的"has..."方法应该是足够的,并且足够通用。
API
API 可在 bazzline.net 上找到。
其他优秀的组件
- 在 packagist 上搜索
- yeriomin/getopt
- ulrichsg/getopt-php
- stuartherbert/CommandLineLib
- auraphp/Aura.Cli
- hoaproject/Console
- deweller/php-cliopts
结束语
如果您喜欢,请给它星标 :-). 如果需要,请添加问题。如果您喜欢,请拉取补丁。如果您使用它,请写一篇博客 :-D。