34

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

<?php
  $name1 = $argv[1];    
  echo $name1;
?>

我像这样从 CLI 传递变量:

C:\xampp\php\php.exe name.php Robby

以上工作,我得到罗比作为输出。

但我想做这样的事情:

C:\xampp\php\php.exe name.php -inputFirstName="Robby"

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

4

8 回答 8

43

从命令行调用 PHP 脚本时,您可以使用 $argc 找出传递了多少参数,并使用 $argv 来访问它们。例如运行以下脚本:

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>

像这样:-

php script.php arg1 arg2 arg3

将给出以下输出

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

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

做你想做的,让我们说

php script.php arg1=4

您需要在等号上展开论点:-

list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));

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

于 2012-06-15T10:38:46.690 回答
19

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

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);

它将处理一个呼叫,例如:

php script.php item1=4 item2=300

通过将其发送到 $_GET 您会自动处理 Web 或 CLI 访问。

对于评论,这是在执行以下操作:

  • 如果参数的数量大于一个(因为第一项是脚本的名称),则继续
  • 获取不包括第一项的参数数组
  • 将其转换为带有 & 符号的标准查询字符串格式
  • 使用 parse_str 提取到 $_GET 数组
于 2013-07-06T15:19:44.773 回答
15

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

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

于 2012-06-15T12:19:41.070 回答
3

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

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];

使用值“Robby”设置 $inputFirstName 的调用将是:

> php script.php --inputFirstName="Robby"

解释

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

于 2017-10-25T11:54:57.093 回答
3

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

C:\xampp\php\php.exe name.php "inputFirstName=Robby&LastName=John"

在你的 PHP 文件中

if (!empty($argv[1])) {
  parse_str($argv[1], $_GET);
}

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

于 2020-04-05T12:50:39.977 回答
1

我不知道当时这个问题是否被问到我要回答的问题是可用的,但是如果你打电话php-cgi -f myfile.php var=something,你可以从命令行中检索到 whit $var=$_GET['var']; ,那么你不必更改你的代码来调用它网络浏览器或命令行

于 2021-03-28T19:05:43.030 回答
0

如果您不介意使用库,我建议您看一下Symfony 的 The Console Component

它可用于创建命令行应用程序并支持使用Arguments & Options

文档页面包含几个很好的示例来帮助您入门。

当然,在引擎盖下,它使用了与 vascowhite 所解释的相同的技术。

于 2018-06-19T09:22:37.533 回答
-1

您可以在程序中解析用户输入以查找特定字符串,例如-inputFirstName="x"(例如使用正则表达式),然后将正确的变量设置为 x。

于 2012-06-15T10:26:45.473 回答