共计 3211 个字符,预计需要花费 9 分钟才能阅读完成。
应用 PHP 开发的同学多少都会接触过 CLI 命令行。常常会有一些定时工作或者一些脚本间接应用命令行解决会更加的不便,有些时候咱们会须要像网页的 GET、POST 一样为这些命令行脚本提供参数。比方在针对某些日期做统计的脚本,就须要传递一个日期给它,这样咱们就统计指定日期的一些数据。这类需要应该十分常见,那么,咱们都是如何来接管这些命令行的参数的呢?明天,就来介绍一下这方面的内容。
$argv 取得所有空格分隔的参数列表
这个变量预计是大家用得比拟多的一个接参变量了。它是 PHP 为咱们筹备好的一个固定变量,目标就是获取传递给脚本的参数数组。
print_r($argv);
// php 如何获取 PHP 命令行参数.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd
// 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=5 ccc ddd
print_r(getopt('a:b:c:d:e:f:'));
// Array
// (// [b] => 2
// => 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
// => 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] =>
// =>
// [d] =>
// )
// 二
// php 如何获取 PHP 命令行参数.php -f
print_r(getopt('f::'));
// Array
// (// [f] =>
// )
print_r(getopt('f:'));
// Array
// (//)
// 三
// php 如何获取 PHP 命令行参数.php -f 22
print_r(getopt('f::'));
// Array
// (// [f] =>
// )
print_r(getopt('f:'));
// Array
// (// [f] => 22
// )
// 四
// php 如何获取 PHP 命令行参数.php -f=22
print_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; // 返回中断地位的索引值,2
echo $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
各自媒体平台均可搜寻【硬核项目经理】