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关键字引用这个全局变量才可以使用