$argv Gets all space-separated parameter lists
This variable is probably a parameter variable that everyone uses more often. It is a fixed variable prepared by PHP for us to obtain the parameter array passed to the script.
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 // )
This array is separated by spaces between parameters. The first element is the name of the currently running script file. That is to say, regardless of whether there are parameters or not, this variable must have an $argv[0] representing the current script file name.
In daily development needs, it is actually enough to use this variable. But this is obviously not our topic today. Everyone noticed that in the above code we have many parameters in the form of -x=xxx. Are parameters in this form very similar to Linux command options? Yes, this is What we’re going to focus on today: getting options from a command line argument list.
getopt() Gets options from the command line parameter list
In fact, it is such a simple function, we can get the specified command value just like Linux command options. And instead of being separated by spaces like $argv, the command option function will encapsulate these command options into an array, forming an array with the option name as the key and the content after the equal sign as the value, which is more convenient for us to use.
// 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 // )
Isn’t it amazing and very intuitive? We directly got the contents of b, c, and d in the form of key-value arrays with a very clear format. Some students want to ask, where are a and e? What about ccc and ddd at the back?
The first thing to note is that ccc and ddd are not standard option parameters. That is to say, the content received by this function is the option starting with -, so ccc and ddd will not be output here, and you need to pay attention to it. Unfortunately, non-option parameters will interrupt the acquisition of option parameters. If you continue to add options starting with - after ccc, you will not be able to obtain them. We will see this later. And what about the option parameters starting with --? Let’s look directly at the long option function below.
Long option
// 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 // )
Yes, the second parameter of the getopt() function is to define this kind of long option starting with --, and it should be noted that the first parameter is String type, the second long option parameter is of array type. Then if we combine them, of course we can get all the parameter information!
// 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, there is no problem in getting the parameter options. Careful students must have discovered another problem. Why is there a colon after the option name defined in the parameter of the getopt() function? This involves our colon rules, please read directly below.
Colon rules
The first two parameters of getopt() support a set of rules for option acquisition:
Individual characters (not accepted value)
The character followed by a colon (this option requires a value)
The character followed by two colons (the value of this option can Select)
Let’s take a look directly through the code.
// 一 // 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 -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 // )
This paragraph is relatively long, let’s look at it piece by piece. The first is abcdef without colon. The returned array contains keys but no values. Corresponding to the above rules, the values of these parameter options are not accepted. When you pass these parameter options, they only have key names and empty content.
The second paragraph defines a parameter but does not give a value. At this time, the double colon :: will have a key name, while the single colon : will have nothing.
The third paragraph is the option value in the form of spaces. Double colon:: There is a key name but no value. Single colon: The key value is normal.
The fourth paragraph is the option value in the form of equal sign =. Both single and double colons receive the key value normally.
Option parameter interruption
We mentioned the problem of parameter interruption above, that is, if a non-option parameter parameter appears after the option parameter, getopt() will no longer be able to obtain this Everything after the non-option parameters.
// php 如何获取PHP命令行参数.php -f=22 aa -b=33 // 选项的解析会终止于找到的第一个非选项,之后的任何东西都会被丢弃。 // Array // ( // [f] => 22 // )
Through this test, it can be clearly seen that the following b option cannot be obtained. At this time, if we want to know where the option parameter is or which parameter is interrupted, we can use the third parameter of the getopt() function.
// 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
推荐学习:php视频教程