CLI程序开发 - 接收参数 ¶
作者:KK
发表日期:2016.10.14
要点速读 ¶
要想运行
php test.php --id=9 --d=/data/www/web
这样带参数的命令时让PHP接收到参数,则在脚本里读取$argv
这个全局数组即可参数以空格隔开,然后里面每个参数具体的语法要自己写逻辑分析,所以就有些软件参数名前面只有一个-号,有的就带2个-号,有的压根没-号
就像php -v
可以用PHP程序输出这个PHP的本号,而又可以用php -l xx.php
来测试一个PHP文件是否有语法错误一样,我们向PHP命令传递了不同的参数来表达了“我希望这个命令程序具体要怎么运行”
那么当我们执行php xx.php
运行这个脚本时,又能否向它传一些参数,让它知道我们的具体意图呢?————当然是可以的啦
CLI运行的时候会有一个全局数组叫$argv
,就像HTTP请求的时候会有$_GET
数组一样,新建脚本写如下代码:
print_r($argv);
来试试命令:
php test.php a b c
输出结果应该是这样的:
Array
(
[0] => index.php
[1] => a
[2] => b
[3] => c
)
表示一共收到了4个参数,其中第一个参数一定是入口文件的文件名,参数以空格分离,所以你明白了吧?为什么那么多软件的参数都是用空格分开的呢,行业标准呀!
参数分析 ¶
玩深了你就会发现,这根本不能方便地满足你的需求,你希望这样执行命令:php test.php --name=Jay --id=9
然后程序大概这样就能读到name和id:
echo $argv['name'];
echo $argv['id'];
结果找不到这样的支持
好吧如果真要这样支持的话,那如果人家的软件想这样设计命令参数怎么办:php test.php -name Ja=y -id 9
这里人家企图让name的值是Ja=y,其中=号也是值的一部分,依然是$argv['name']
来支持读取参数是吗?
其实你可能还没接触过参数声明方式更加特异的软件,其实做多了程序设计你应该感觉得到:不应该限制太多
所以在命令行上,操作系统以及PHP也没限制太多,要怎么表达参数由软件开发者自己定义,运行平台提供基本的支持就可以了
所以如果你想自动解析--name=xxx
这样的参数的话,则需要自己写解析函数对$argv
参数进行解析才可以
包括你接触过的其他框架的CLI运行模式下,人家都是自行封装了代码去解析$argv的
$argv的作用域(不是超全局数组) ¶
这里强调一下,$argv变量虽然装载了命令行参数,但它并不是像$_GET
数组那样的超全局变量,所以如果你在函数里访问这个数组的话,需要用global关键字引用这个全局变量才可以使用