我在php中编写一个小命令行应用程序。
处理命令行参数和选项的正确方法是什么?
似乎有argv数组,$ _SERVER ['argv']和getopt,但是何时使用它们会令人困惑?
关于选项,即“参数 - 选项”,获得这些选项的最佳方法是什么?
答案 0 :(得分:4)
您可以使用$ argv检索“原始”参数。 另见:http://www.php.net/manual/de/reserved.variables.argv.php
示例:php file.php a b c
$argv
将包含"file.php", "a", "b"
和"c"
。
使用getopts
获取“已解析”参数,PHP将为您完成脏工作。所以这可能是你想要通过--options
传递参数的最佳方式。
仔细看看http://www.php.net/manual/de/function.getopt.php
它很好地描述了这个功能。
答案 1 :(得分:0)
很长时间以来,我一直在尝试使用它,但事实证明,它对于这项工作来说太简单了,无法成为一个好工具。所以这是我的看法。充当存储功能,解析器和参数查询功能的函数。
arg("
-a --alpha bool Some explanation about this option
-b --beta bool Beta has some notes too
-n --number int Some number you need for the script
-o --others str A string of other things
");
// yes, this is how you initialize it; does the parsing too.
// it's the same string as what you'd use for a help screen.
要点是:您像编写了某种帮助一样编写了此多行字符串,它解析了行并自动找出了参数。 (将列分隔为两个或更多空格-就像您一样)。解析后,每个项目将由一个名为 char,word,type 和 help 。如果没有短(字符)或长(单词)版本的参数,只需使用破折号即可。显然,两者都不适用。
类型就是它们的外观: bool 表示参数后没有任何值。如果丢失,则为false;如果存在,则为true。 int 和 str 类型意味着必须有一个值,而 int 确保它是整数。不支持可选参数。值可以用空格或等号分隔(即“ -a = 4”或“ -a 4”)
在第一次调用之后,您将所有参数整齐地组织在一个结构中(将其转储,您将看到),并且可以像这样查询它们的值:
print arg("alpha"); // returns the value of -a or --alpha
print arg("a"); // same thing
print arg(); // returns the whole parsed array
print arg(1); // returns the first non-option argument
print arg(999); // returns null unless you're a true maniac :)
function arg($x="",$default=null) {
static $arginfo = [];
if(false!==strpos($x,"\n")) { // init by multiline
// parse multiline text input
$args = $GLOBALS["argv"] ?: [];
$rows = preg_split('/\s*\n\s*/',trim($x));
$data = explode(",","char,word,type,help");
foreach($rows as $row) {
list($char,$word,$type,$help) = preg_split('/\s\s+/',$row);
$char = trim($char,"-");
$word = trim($word,"-");
$key = $word ?: $char ?: ""; if($key==="") continue;
$arginfo[$key] = compact($data);
$arginfo[$key]["value"] = null;
}
$nr = 0;
while($args) {
$x = array_shift($args);
if($x[0]<>"-") {
$arginfo[$nr++]["value"] = $x;
continue;
}
$v = null; if(false!==strpos($x,"=")) list($x,$v) = explode("=",$x,2);
$x = trim($x,"-");
$k = "";foreach($arginfo as $k=>$arg) if(($arg["char"]==$x)||($arg["word"]==$x)) break;
$t = $arginfo[$k]["type"];
switch($t) {
case "bool" : $v = true; break;
case "str" : if(is_null($v)) $v = array_shift($args); break;
case "int" : if(is_null($v)) $v = array_shift($args); $v = intval($v); break;
}
$arginfo[$k]["value"] = $v;
}
return $arginfo;
}
if($x==="") return $arginfo;
if(!is_null($arginfo[$x]["value"])) return $arginfo[$x]["value"];
return $default;
}
我希望这可以像以前一样帮助很多失落的灵魂。希望这个小功能可以让您不必编写帮助和解析器并使它们保持同步...的美好之处。此外,一旦解析了该方法,它就快如闪电,因为它可以缓存变量,因此您可以调用尽可能多的变量您想要的时间。它的行为就像一个超全局的。
评论表示赞赏。 对我有用或对我都不有用。
旁注:是的,我意识到这是2012年的问题,但是我想为需要它的人提供此方便的小功能。控制台PHP脚本很酷,为什么不那么简单。