zoukankan      html  css  js  c++  java
  • php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数

    在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法
    1.直接使用argv变量数组。 
    2.使用$_SERVER['argv']全局变量来获取,其值和1是一样的。

    3.使用getopt方法

    #getopt方法格式
    array getopt ( string $options [, array $longopts ] )

    options:该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 选项字符串只允许 a-z、A-Z 和 0-9。
        示例:print_r(getopt('a:b::c'));将会得到一个数组,其后面的冒号规则如下:
        •单独的字符(不接受值)
        •后面跟随冒号的字符(此选项需要值)
        •后面跟随两个冒号的字符(此选项的值可选)
        所以:getopt('a:b::c')即表示a是需要的值,b是可选值,c是不要的值(传了也置空)
        注:选项的值是字符串后的第一个参数。它不介意值之前是否有空格。
    PHP程序示例:

    <?php
    print_r(getopt('a:b::c'));
    echo "
    --------------------
    ";

    入参命令及显示结果:你会发现也有一些现象:

    [root@123 ~]# php a.php -a=1 -b=5 -c=6 -d=4   
    Array
    (
        [a] => 1
        [b] => 5
        [c] => 
    )
    --------------------
    #结果:遇到不接受的c后,后面的参数都不会再处理。
    
    [root@123 ~]# php a.php -a 1 -b=5 -c=6 -d=4 
    Array
    (
        [a] => 1
        [b] => 5
        [c] => 
    )
    --------------------
    [root@123 ~]# php a.php -a 1 -b5 -c=6 -d=4 
    Array
    (
        [a] => 1
        [b] => 5
        [c] => 
    )
    --------------------
    [root@123 ~]# php a.php -a 1 -b 5 -c=6 -d=4 
    Array
    (
        [a] => 1
        [b] => 
    )
    --------------------
    #为什么上面的-b后面用空格会导致b取不到结果?文档明明写着=和空格都是可以的。
    #我试验感觉有这么一个规律:最后一个值不能和参数有空格。

        写到这里我真感觉这不是一个什么好方法!真够麻烦的,而且这个单字符传参没可读性,不过还是提一下,我在使用的时候发现命令行里还可以传递数组的,比如你可以传递-a=1后,再接着传一个-a=5,则得到的-a自动变成一个二维数组,包含两个值。不过觉得意义不大。接下来再看longopts:
    longopts:选项数组。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(--)传入到脚本的选项。因为options只允许单个字符,而这在程序中没有什么可读性,当然不可取。所以有必要使用longopts。
    options 和 longopts 的格式几乎是一样的,唯一的不同之处是 longopts 需要是选项的数组(每个元素为一个选项) 
    PHP程序示例:

    <?php
    print_r(getopt('',array('type:')));

    结果示例:

    [root@123 ~]# php a.php --id 101 --type=1 --age=4 
    Array
    (
        [id] => 101
        [type] => 1
        [age] => 
    )
    --------------------
    [root@123 ~]# php a.php --id 101 --type 1 --age=4 
    Array
    (
        [id] => 101
        [type] => 
    )
    --------------------
    #仍是一样:最后一个值不能和参数有空格。

        真心觉得longopts一样也是一个麻烦的东西,真不知道getopt有什么卖点,既然$argv能取到值那么在PHP里使用一个方法一下子就得到键值不就行了。于是我试着用这么一个方法:

    <?php
    function getClientArgs()
    {
        global $argv;
        array_shift($argv);
        $args = array();
        array_walk($argv, function($v ,$k) use(&$args){
            @list($key, $value) = @explode('=', $v);
            $args[$key] = $value;
        });
        return $args;
    }
    $args = getClientArgs();
    print_r($args);

    然后在命令行中执行:显示如下,这样是不是更简洁明了?

    [root@123 ~]# php test2.php id=4 type=1001 age=25
    Array
    (
        [id] => 4
        [type] => 1001
        [age] => 25
    )

    例子:

  • 相关阅读:
    用大白话谈谈XSS与CSRF
    Lenet5设计理解——咬文嚼字系列
    【java设计模式】之 责任链(chain of resposibility)模式
    【java设计模式】之 代理(Proxy)模式
    【java设计模式】之 建造者(Builder)模式
    【java设计模式】之 模板方法(Template Method)模式
    【java设计模式】之 抽象工厂(Abstract Factory)模式
    【java设计模式】之 工厂(Factory)模式
    浅谈Arrays.asList()方法的使用
    分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
  • 原文地址:https://www.cnblogs.com/-mrl/p/10158800.html
Copyright © 2011-2022 走看看