我通常使用argparse module in Python来检测选项/参数,打印用法等。我试图在本机代码中使用PHP获得相同的结果,或者使用一些轻量级的库/框架而不需要编写大量的包装线。
从我的研究中,我刚刚发现getop()'s native PHP implementation,它非常像getop()'s C implementation,并且作为特定用途的框架非常有限(独占选项,前缀选项,参数冲突处理程序,选择,metavars)等)。我想找到一种简单的方法来在PHP中获得相同的结果,而不使用原始argv
,reinventing the wheel或实现“yet another improved library for getop()”来解析参数。
这是argparse
示例在Python中的外观:
from argparse import ArgumentParser, ONE_OR_MORE, ArgumentDefaultsHelpFormatter
__version__ = '3.14'
description = 'some description'
parser = ArgumentParser(
prog = 'someprogram',
description = description,
epilog = None,
parents = [],
formatter_class = ArgumentDefaultsHelpFormatter,
prefix_chars = '-',
fromfile_prefix_chars = None,
argument_default = None,
conflict_handler = 'error',
add_help = True,
)
parser.add_argument('-o', '--output',
action = 'store',
metavar = '/path/to/output',
dest = 'output',
choices = None,
help = 'Set the output directory')
parser.add_argument('-q', '--quiet',
action = 'store_true',
dest = 'quiet',
default = False,
help = 'Don\'t print status messages to stdout')
parser.add_argument(option_strings = ['FILES'],
metavar = 'FILES',
nargs = ONE_OR_MORE,
type=str,
dest = 'FILES',
help = 'One or more files to process')
parser.add_argument('-v', '--version',
action ='version',
version ='%(prog)s {version}'.format(version = __version__),
help = 'Shows the program version')
args = parser.parse_args()
在PHP中,您可以转换相同的行为,但是您需要很多行来完全模拟像Python这样的参数解析器。
PS:请不要把这个问题当作python vs php,我可能是同样的ruby vs php,java vs php或其他。它只是关于如何使用本机库在另一种不同的语言中移植代码。答案 0 :(得分:0)
我刚刚发现了对python argparse库的几乎近似。 php library Getopt.PHP在argparse中部分模拟具有多个特征和相同行为的解析器。
例如add_options()
〜= addOptions()
方法,包含位置或必需参数,自动使用生成,检索值,错误处理等。
此时,它还需要一些更高级的功能,如冲突处理程序,选择或metavar,仅解析已知值,参数排除,nargs等。但我可以轻松扩展或使用它作为良好的实现基础启动。
我的问题中的Python示例代码几乎可以翻译(缺少功能):
$getopt = new Getopt;
$getopt->addOptions(array(
array('o', 'output', Getopt::OPTIONAL_ARGUMENT, 'Set the output directory'),
array('q', 'quiet', Getopt::OPTIONAL_ARGUMENT, 'Don\'t print status messages to stdout'),
array('v', 'version', Getopt::OPTIONAL_ARGUMENT, 'Shows the program version'),
array('FILES', NULL, Getopt::REQUIRED_ARGUMENT),
));
$getopt->parse();