2013-04-24 21 views
0

我通常使用argparse module in Python來檢測選項/參數,打印用法等。我試圖從本機代碼或使用一些輕量級庫/框架沒有寫很多包裝線。如何獲得PHP中的getop()的高級用法,如python argparse

從我的研究,我只是發現getop()'s native PHP implementation,那是相當的喜歡getop()'s C implementation和非常有限的某些用途(不包括期權,期權的前綴,參數衝突處理,選擇,metavars等)的框架。我想找到一種簡單的方法在PHP中獲得相同的結果,而不使用原始的argv,reinventing the wheel或實現用於getop()的「yet another improved library」來解析參數。

這是​​例子看起來如何在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,我可以是相同的紅寶石vs php,java vs php或其他。這只是關於如何使用本機庫以另一種不同的語言將代碼良好且高效地移植到其中。

回答

0

我剛剛發現了一個近似apthon的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();