Home  >  Article  >  Backend Development  >  A brief discussion on how to obtain command line parameters in PHP

A brief discussion on how to obtain command line parameters in PHP

青灯夜游
青灯夜游forward
2021-06-24 19:30:502347browse

In the PHP CLI command line, it is necessary to provide parameters for the command line script like GET and POST on the web page; so how to obtain these command line parameters? The following article will show you how to obtain command line parameters in PHP, and introduce the $argv variable and getopt() function.

A brief discussion on how to obtain command line parameters in PHP

$argv Gets a list of all space-separated parameters

This variable is probably an access 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 just like Linux command options value. 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 at the beginning, and it should be noted that , the first parameter is of string type, and 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 (No values ​​accepted)
  • Characters followed by a colon (value required for this option)
  • Characters followed by two colons (value for this option optional)

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() All content following this non-option parameter can no longer be obtained.

// 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

The comment has been written very clearly. The third parameter will call back the index of the parameter option interruption position, and this index is consistent with the index sequence position of $argv.

Summary

To be honest, before reading the document, I really only knew that there is an $argv variable that can be used to obtain the parameters of the command line script. Through this study Only then did I discover that there is such a powerful option parameter function. The learning process is very simple. How to apply it to real projects is the key. Come on, study hard and practice hard!

测试代码:
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视频教程

The above is the detailed content of A brief discussion on how to obtain command line parameters in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:juejin.cn. If there is any infringement, please contact admin@php.cn delete