print_r($argv);//php如何获取PHP命令行参数.php--a=1-b=2-c=3-d=4--e=5cccddd//Array//(//[0]=>如何获取PHP命令行参数.php//[1]=>--a=1//[2]=>-b=2//[3]=>-c=3//[4]=>-d=4//[5]=>--e=5//[6]=>ccc//[7]=>ddd//)
这个数组因此参数间隔的空格进行分隔的。第1个元素是当前运行的脚本文件名,也便是说,不管有没有参数,这个变量一定会有一个 $argv[0] 表示的是当前的脚本文件名。
在日常的开拓需求中,实在利用这个变量就已经够用了。但是这明显不会是我们本日的主题,大家把稳到上面的代码中我们有很多参数是 -x=xxx 的形式,这种形式的参数是不是和 Linux 的命令选项非常像,没错,这便是我们本日要重点先容的:从命令行参数列表中获取选项。
getopt() 从命令行参数列表中获取选项实在便是这样一个大略的函数,我们就可以像 Linux 的命令选项一样获取指定的命令值。而且不是像 $argv 按空格进行分隔,命令选项函数会将这些命令选项封装成数组,组成以选项名为键,以等号后面的内容为值的数组,更加方便我们的利用。
//php如何获取PHP命令行参数.php--a=1-b=2-c=3-d=4--e=5cccdddprint_r(getopt('a:b:c:d:e:f:'));//Array//(//[b]=>2//[c]=>3//[d]=>4//)
是不是很神奇,而且非常直不雅观吧,我们直接就拿到了 b 、 c 、d 的内容并且是格式非常清晰的键值数组形式。有同学要问了,a 和 e 呢?还有后面的 ccc 、 ddd 呢?
首先要解释的是,ccc 和 ddd 不是标准的选项参数,也便是说,这个函数吸收的内容因此 - 开头的选项,以是 ccc 和 ddd 不会在这里输出,并且须要把稳的是,非选项参数会中断选项参数的获取,在 ccc 之后如果连续添加 - 开头的选项也是无法获取到的,这个我们后面还会看到。而 -- 开头的选项参数呢?我们直接看下面的长选项功能。
长选项//php如何获取PHP命令行参数.php--a=1-b=2-c=3-d=4--e=5cccdddprint_r(getopt('',['a:','b:','c:','d:','e:','f:']));//Array//(//[a]=>1//[e]=>5//)
没错,getopt() 函数的第二个参数便是定义这种 -- 开头的长选项的,而且须要把稳的是,第一个参数是字符串类型,第二个长选项参数是数组类型的。那么我们把它们结合起来,就当然可以获取到全部的参数信息啦!
//php如何获取PHP命令行参数.php--a=1-b=2-c=3-d=4--e=5cccdddprint_r(getopt('a:b:c:d:e:f:',['a:','b:','c:','d:','e:','f:']));//Array//(//[a]=>1//[b]=>2//[c]=>3//[d]=>4//[e]=>5//)
OK,参数选项获取没问题了吧,细心的同学肯定又创造了一个问题,这个 getopt() 函数的参数中定义的选项名称后面为啥都要加个冒号?这就涉及到我们的冒号规则了,请直接往下看。
冒号规则getopt() 的前两个参数都支持一套关于选项获取的规则:
单独的字符(不接管值)后面跟随冒号的字符(此选项须要值)后面跟随两个冒号的字符(此选项的值可选)我们还是直接通过代码来看一下。
//一//php如何获取PHP命令行参数.php--a=1-b=2-c=3-d=4--e=5cccdddprint_r(getopt('abcdef'));//Array//(//[b]=>//[c]=>//[d]=>//)//二//php如何获取PHP命令行参数.php-fprint_r(getopt('f::'));//Array//(//[f]=>//)print_r(getopt('f:'));//Array//(//)//三//php如何获取PHP命令行参数.php-f22print_r(getopt('f::'));//Array//(//[f]=>//)print_r(getopt('f:'));//Array//(//[f]=>22//)//四//php如何获取PHP命令行参数.php-f=22print_r(getopt('f::'));//Array//(//[f]=>22//)print_r(getopt('f:'));//Array//(//[f]=>22//)
这一段比较长,我们一块一块来看。首先是不带冒号的 abcdef 写法,返回的数组中都包含键,但没有值,对应上面的规则便是不接管这些参数选项的值,你传了这些参数选项也是只有键名而内容是空的。
第二段是定义了一个参数,但是不给值,这时,双冒号 :: 会有键名,而单冒号 : 则什么都没有。
第三段是空格形式的选项值,双冒号 :: 有键名但没有值,单冒号 : 键值正常。
第四段是等号 = 形式的选项值,单双冒号都正常吸收到键值。
选项参数中断上文中我们提到过参数中断的问题,便是在选项参数之后如果有一个非选项参数的参数涌现,getopt() 就无法再获取到这个非选项参数后面的所有内容了。
//php如何获取PHP命令行参数.php-f=22aa-b=33//选项的解析会终止于找到的第一个非选项,之后的任何东西都会被丢弃。//Array//(//[f]=>22//)
通过这个测试可以清晰的看出后面的 b 选项无法获取。这时,如果我们想知道选项参数在什么地方或者由于哪个参数而中断的话,就可以利用 getopt() 函数的第三个参数了。
//php如何获取PHP命令行参数.php-f=22aa-b=33$optind=null;getopt('f:b:',[],$optind);echo$optind,PHP_EOL;//返回中断位置的索引值,2echo$argv[$optind],PHP_EOL;//等同于$argv的索引顺序,aa
注释已经写得很清晰了,第三个参数会回调一个参数选项中断位置的索引,并且这个索引是和 $argv 的索引顺序位置同等的。
总结说实话,在没看文档前真的只知道有一个 $argv 变量可以用来获取命令行脚本的参数,通过这次学习才创造原来还有一个这么强大的选项参数函数。学习的过程非常大略,如何利用到真实的项目中才是关键所在,加油学习,努力实践吧!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96PHP%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.php
参考文档:
https://www.php.net/manual/zh/reserved.variables.argv.php
https://www.php.net/manual/zh/function.getopt.php