PHP命令行参数和选项

时间:2012-08-20 19:21:43

标签: php

我在php中编写一个小命令行应用程序。

处理命令行参数和选项的正确方法是什么?

似乎有argv数组,$ _SERVER ['argv']和getopt,但是何时使用它们会令人困惑?

关于选项,即“参数 - 选项”,获得这些选项的最佳方法是什么?

2 个答案:

答案 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)

有一天,我醒来就像“没有更多的getopt()” ...

很长时间以来,我一直在尝试使用它,但事实证明,它对于这项工作来说太简单了,无法成为一个好工具。所以这是我的看法。充当存储功能,解析器和参数查询功能的函数。

使用方法:

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脚本很酷,为什么不那么简单。