美文网首页PHP开发PHP经验分享PHP实战
php冷知识 - 从命令行参数列表中获取选项

php冷知识 - 从命令行参数列表中获取选项

作者: Heropoo | 来源:发表于2020-04-24 21:38 被阅读0次

    分享一个php的冷知识 - 从命令行参数列表中获取选项

    用到的函数是getopt

    说明

    函数签名是这样的

    getopt ( string $options [, array $longopts [, int &$optind ]] ) : array|bool false
    

    解析传入脚本的选项,成功返回数组,解析失败返回false

    参数

    • options 该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 比如,一个选项字符串 "x" 识别了一个选项 -x。 只允许 a-z、A-Z 和 0-9。

    • longopts 选项数组。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(--)传入到脚本的选项。 例如,长选项元素 "opt" 识别了一个选项 --opt。

    • optind 如果存在optind参数,则参数解析停止的索引将被写入此变量。

    参数值

    options 可能包含了以下元素:

    • 单独的字符(不接受值)
    • 后面跟随冒号的字符(此选项需要值)
    • 后面跟随两个冒号的字符(此选项的值可选)

    optionslongopts 的格式几乎是一样的,唯一的不同之处是 longopts 需要是选项的数组(每个元素为一个选项),而 options 需要一个字符串(每个字符是个选项)。

    例子

    说了这么多,我们举例说明吧

    1. 基本用法

    <?php
    // Script 1.php
    $options = getopt("h:p:d");
    var_dump($options);
    ?>
    

    命令行下测试看看

    php 1.php -h 127.0.0.1 -p 8000 -d
    

    以上例程会输出:

    array(3) {
      ["h"]=>
      string(9) "127.0.0.1"
      ["p"]=>
      string(4) "8000"
      ["d"]=>
      bool(false)
    }
    

    选项参数也可以中间不要空格

    php 1.php -h 127.0.0.1 -p 8000 -d
    

    php5.3之后还可以使用 "=" 作为 参数和值的分隔符

    php 1.php -h=127.0.0.1 -p=8000 -d
    

    2. 引入长选项

    <?php
    // Script 2.php
    $shortopts  = "";       // 短选项 用字母字符串
    $shortopts .= "h:";     // 必选选项 字母后面一个冒号
    $shortopts .= "p::";    // 可选选项 字母后面两个冒号
    $shortopts .= "vd";     // 无需值的选项 字母后面没有冒号
    
    $longopts  = array(     // 长选项 用单词的数组
        "host:",            // 必选选项 单词后面一个冒号
        "port::",           // 可选选项 单词后面两个冒号
        "version",          // 无需值的选项 单词后面没有冒号
        "debug",            // 无需值的选项 单词后面没有冒号
    );
    
    $options = getopt($shortopts, $longopts);
    var_dump($options);
    ?>
    

    运行测试:

    php 2.php -h127.0.0.1 -p8000 -d --host=127.0.0.1 --port=8000 --version --debug
    

    输出:

    array(7) {
      ["h"]=>
      string(9) "127.0.0.1"
      ["p"]=>
      string(4) "8000"
      ["d"]=>
      bool(false)
      ["host"]=>
      string(9) "127.0.0.1"
      ["port"]=>
      string(4) "8000"
      ["version"]=>
      bool(false)
      ["debug"]=>
      bool(false)
    }
    

    3. 同一选项可以传递多次

    运行测试:

    php 2.php -d -d --version --debug --port=123 --port=234
    

    输出:

    array(4) {
      ["d"]=>
      array(2) {     // 多个选项参数值以数组呈现
        [0]=>
        bool(false)
        [1]=>
        bool(false)
      }
      ["version"]=>
      bool(false)
      ["debug"]=>
      bool(false)
      ["port"]=>
      array(2) {
        [0]=>
        string(3) "123"
        [1]=>
        string(3) "234"
      }
    }
    

    4. 使用 optind

    // Script 3.php
    $optind = null;
    $opts = getopt('a:b:', [], $optind);
    var_dump($argv);
    var_dump($optind);
    $pos_args = array_slice($argv, $optind);  // 从数组中取出一段
    var_dump($pos_args);
    

    运行测试:

    php 3.php -a 1 -b 2 -- test
    

    输出:

    array(7) {
      [0]=>
      string(7) "cli.php"
      [1]=>
      string(2) "-a"
      [2]=>
      string(1) "1"
      [3]=>
      string(2) "-b"
      [4]=>
      string(1) "2"
      [5]=>
      string(2) "--"
      [6]=>
      string(4) "test"
    }
    int(6)      // $optind = 6
    array(1) {
      [0]=>
      string(4) "test"
    }
    

    至此以后就可以写出漂亮优雅的cli程序了😎😎😎

    参考

    相关文章

      网友评论

        本文标题:php冷知识 - 从命令行参数列表中获取选项

        本文链接:https://www.haomeiwen.com/subject/cjnqwhtx.html