PHP,将参数从命令行传递给PHP脚本

125*_*369 26 php parameter-passing command-line-interface

我想从PHP命令行界面传递参数,然后使用PHP脚本读取值,如下所示:

<?php
  $name1 = $argv[1];    
  echo $name1;
?>
Run Code Online (Sandbox Code Playgroud)

我从CLI传递变量,如下所示:

C:\xampp\php\php.exe name.php Robby
Run Code Online (Sandbox Code Playgroud)

上面的作品,我得到了罗比作为输出.

但我想做这样的事情:

C:\xampp\php\php.exe name.php -inputFirstName="Robby"
Run Code Online (Sandbox Code Playgroud)

这样用户就可以在正确的位置输入正确的参数.解析这些参数的适当方法是什么?

vas*_*ite 35

从命令行调用PHP脚本时,您可以使用$ argc来查找传递的参数数量,并使用$ argv来访问它们.例如,运行以下脚本:

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>
Run Code Online (Sandbox Code Playgroud)

像这样:-

php script.php arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

将给出以下输出

int(4)
array(4) {
  [0]=>
  string(21) "d:\Scripts\script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅$ argv$ argc.

为了做你想做的事,让我们说

php script.php arg1=4
Run Code Online (Sandbox Code Playgroud)

你需要在等号上爆炸参数: -

list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));
Run Code Online (Sandbox Code Playgroud)

这样你就可以在等号前面得到任何你想要的东西,而不必解析它,只需检查key =>值对是否正确.但是,这有点浪费,只需指示用户输入正确的顺序即可传递参数.


小智 13

虽然答案是正确的,并且您可以手动进行解析,但PHP还提供了getopt()可能在此实际提供的功能.

还有面向对象的替代方案(用PHP编写,可在许多库中找到),这些替代方案可能会成为您所需要的.谷歌搜索"php getopt"将产生有用的结果.

  • 你说的“getopt()”是一个更好的解决方案是正确的(因为它是 PHP 原生的),但是最好通过这里提出的问题的可行解决方案来证明你的观点..这将是一个更好的答案,将获得更多选票;) (3认同)

小智 13

我使用这个相当简洁的方法:

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);
Run Code Online (Sandbox Code Playgroud)

哪个会处理如下呼叫:

php script.php item1=4 item2=300
Run Code Online (Sandbox Code Playgroud)

通过将其发送到$ _GET,您可以自动处理Web或CLI访问.

对于评论,这是做以下事情:

  • 如果参数计数大于1(因为第一项是脚本的名称),则继续
  • 抓取参数数组,不包括第一项
  • 将其转换为带有&符号的标准查询字符串格式
  • 使用parse_str解压缩到$ _GET数组


Mas*_*Mas 7

您可以将参数作为一个参数发送,然后像 $_GET 数组一样解析该参数

C:\xampp\php\php.exe name.php "inputFirstName=Robby&LastName=John"
Run Code Online (Sandbox Code Playgroud)

并在你的 PHP 文件中

if (!empty($argv[1])) {
  parse_str($argv[1], $_GET);
}
Run Code Online (Sandbox Code Playgroud)

你会像往常一样在 $_GET 数组中获得参数


bnp*_*887 5

getopt()函数可能是该问题的最正确答案。特别是因为 PHP 5.3 使得它与平台无关。在这个问题的特定情况下并解析多个参数,利用此函数的一种方法如下:

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];
Run Code Online (Sandbox Code Playgroud)

将 $inputFirstName 设置为值“Robby”的调用如下:

> php script.php --inputFirstName="Robby"
Run Code Online (Sandbox Code Playgroud)

解释

所有预期参数的默认值都在数组中设置$defaultValues。通过命令行参数发送的输入由 PHPgetopt函数收集并由$givenArguments. :请注意,字符串末尾的冒号 ( )"inputFirstName:"表示这是必需的参数。如果这里没有冒号,则只会检测到参数的存在,而不是实际值(更多信息请参阅 PHP 手册)。在第三行将这两个数组合并在一起会产生数组,其中所有预期参数都使用默认值或命令行/终端提供的参数(如果可用)进行设置。