Я обычно использую модуль argparse в Python для обнаружения параметров / параметров, использования печати и т. Д. Я пытаюсь получить те же результаты в PHP из собственного кода или используя небольшую библиотеку / фреймворк, не набирая много оберточных линий.
Из моих исследований я только что нашел встроенную PHP-версию getop () , которая очень похожа на реализацию C-метода getop () и очень ограничена в качестве рамки для определенных целей (эксклюзивные опции, префиксные опции, обработчик конфликтов параметров, выбор , метавары и т. д.). Я хотел бы найти простой способ получить те же результаты в PHP без использования raw argv
, изобретать колесо или реализовать « еще одну улучшенную библиотеку для getop ()» для анализа аргументов.
Вот как argparse
пример 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 или другим. Речь идет о том, как хорошо переносить код и эффективно на другом языке, используя собственные библиотеки.
Я просто нашел почти aproximation для библиотеки 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();