PHP如何使用getopt()函数
这篇文章将为大家详细讲解有关PHP如何使用getopt()函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
getopt() 从命令行参数列表中获取选项
其实就是这样一个简单的函数,我们就可以像 Linux 的命令选项一样获取指定的命令值。而且不是像 $argv 按空格进行分隔,命令选项函数会将这些命令选项封装成数组,组成以选项名为键,以等号后面的内容为值的数组,更加方便我们的使用。
// php 如何获取PHP命令行参数.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_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=5 ccc ddd print_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=5 ccc ddd print_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=5 ccc ddd print_r(getopt('abcdef'));// Array// (// [b] => // [c] => // [d] => // )// 二// php 如何获取PHP命令行参数.php -fprint_r(getopt('f::'));// Array// (// [f] => // )print_r(getopt('f:'));// Array// (// )// 三// php 如何获取PHP命令行参数.php -f 22print_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=22 aa -b=33// 选项的解析会终止于找到的第一个非选项,之后的任何东西都会被丢弃。// Array// (// [f] => 22// )
通过这个测试可以清晰的看出后面的 b 选项无法获取。这时,如果我们想知道选项参数在什么地方或者因为哪个参数而中断的话,就可以使用 getopt() 函数的第三个参数了。
// php 如何获取PHP命令行参数.php -f=22 aa -b=33$optind = null;getopt('f:b:', [], $optind);echo $optind, PHP_EOL; // 返回中断位置的索引值,2echo $argv[$optind], PHP_EOL; // 等同于 $argv 的索引顺序,aa
注释已经写得很清晰了,第三个参数会回调一个参数选项中断位置的索引,并且这个索引是和 $argv 的索引顺序位置一致的。
关于"PHP如何使用getopt()函数"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。