Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,将参数从命令行传递到PHP脚本_Php_Parameter Passing_Command Line Interface - Fatal编程技术网

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

PHP,将参数从命令行传递到PHP脚本,php,parameter-passing,command-line-interface,Php,Parameter Passing,Command Line Interface,我想从PHP命令行界面传递参数,然后使用PHP脚本读入值,如下所示: <?php $name1 = $argv[1]; echo $name1; ?> C:\xampp\php\php.exe name.php Robby C:\xampp\php\php.exe name.php -inputFirstName="Robby" 上面的工作,我得到Robby作为输出 但我想这样做: <?php $name1 = $argv[1]; echo

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

<?php
  $name1 = $argv[1];    
  echo $name1;
?>
C:\xampp\php\php.exe name.php Robby
C:\xampp\php\php.exe name.php -inputFirstName="Robby"
上面的工作,我得到Robby作为输出

但我想这样做:

<?php
  $name1 = $argv[1];    
  echo $name1;
?>
C:\xampp\php\php.exe name.php Robby
C:\xampp\php\php.exe name.php -inputFirstName="Robby"

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

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

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

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>
将给出以下输出

int(4)
array(4) {
  [0]=>
  string(21) "d:\Scripts\script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}
有关更多详细信息,请参阅和

做你想做的事,让我们说

php script.php arg1=4
您需要在等号上分解参数:-

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

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

虽然答案正确,您可以手动进行解析,但PHP还提供了
getopt()
函数,该函数在这里可能会提供有用的功能


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

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

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);
它将处理以下呼叫:

php script.php item1=4 item2=300
通过将其发送到$\u,您可以自动处理web或CLI访问

对于评论,这是在做以下工作:

  • 如果参数计数大于一(因为第一项是脚本的名称),则继续
  • 获取不包括第一项的arguments数组
  • 使用符号将其转换为标准查询字符串格式
  • 使用parse\u str提取到$\u GET数组
对于这个问题,
getopt()
函数可能是最正确的答案。特别是因为它是用PHP5.3实现的独立于平台的。在这个问题和解析多个参数的特定情况下,利用此函数的一种方法如下:

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];
将$inputFirstName设置为值“Robby”的调用将是:

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


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

如果您不介意使用库,我建议您看看

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

文档页面包含两个很好的示例,可以帮助您入门


当然,它使用了与vascowhite解释的相同的技术。

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

C:\xampp\php\php.exe name.php "inputFirstName=Robby&LastName=John"
在PHP文件中

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

您将像往常一样在$\u get数组中获得参数

我不知道当时是否有人问过这个问题,我将回答什么问题,但是如果您调用
php cgi-f myfile.php var=something
,您可以通过
检索$var=$\u get['var'从命令行,则无需更改代码,即可从web浏览器或命令行调用它。

“当禁用register_argc_argv时,此变量不可用”。只是一个旁注/问题:答案中的
:-
而不是
,原因是什么?@trejder这只是个人偏好。我认为:-看起来比:没有其他原因:)@vascowhite品味高雅,先生。我也喜欢鼻子您认为
getopt()
是一个更好的解决方案是正确的(因为它在PHP中是本机的),但是最好通过一个解决问题的有效解决方案来证明您的观点。。这将是一个更好的答案,它将获得更多的选票;)