如何在php中获得getop()的高级用法,如python argparse


How to get advanced usage of getop() in php like python argparse

我通常在Python中使用argparse模块来检测选项/参数,打印使用情况等。我试图从本地代码或使用一些轻量级库/框架在PHP中获得相同的结果,而无需编写大量的换行。

从我的研究,我刚刚发现getop()的原生PHP实现,这是非常像getop()的C实现和非常有限的框架的某些用途(排他性选项,前缀选项,参数冲突处理程序,选择,元变量等)。我想找到一个简单的方法来获得相同的结果在PHP中不使用原始的argv,重新发明轮子或实现"另一个改进的库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或其他。它只是关于如何使用本地库在另一种不同的语言中有效地移植代码。

我刚刚找到了一个近似于python argparse库的库。php库Getopt.PHP部分模拟了argparse中具有几个特性和相同行为的解析器。

例如add_options() ~= addOptions()方法,带有位置或必要的参数,自动生成用法,检索值,错误处理等

目前,它仍然需要一些工作来实现更高级的功能,如冲突处理程序、选择或元变量、只解析已知值、参数排除、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();