我想从 PHP 命令行界面传递参数,然后使用 PHP 脚本读取值,如下所示:
<?php
$name1 = $argv[1];
echo $name1;
?>
我像这样从 CLI 传递变量:
C:\xampp\php\php.exe name.php Robby
上面的工作,我得到 Robby 作为输出。
但我想做这样的事情:
C:\xampp\php\php.exe name.php -inputFirstName="Robby"
以便用户充分了解在正确的位置输入正确的参数。解析这些参数的正确方法是什么?
从命令行调用 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"
}
做你想做的事,让我们说
php script.php arg1=4
您需要在等号上展开论证:-
list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));
这样你就可以在等号前面添加任何你想要的内容,而无需解析它,只需检查 key=>value 对是否正确即可。然而,这有点浪费,只需指导用户按照正确的顺序传递参数即可。
我使用这个相当简洁的方法:
if($argc>1)
parse_str(implode('&',array_slice($argv, 1)), $_GET);
它将处理诸如以下的呼叫:
php script.php item1=4 item2=300
通过将其发送到
$_GET
,您可以自动处理 Web 或 CLI 访问。
对于评论,这是执行以下操作:
parse_str
提取到 $_GET
数组虽然答案是正确的并且您可以手动进行解析,但 PHP 还提供了
getopt()
函数,该函数实际上可能在这里有用。
还有面向对象的替代方案(用 PHP 编写,在许多库中可用)可能正是您所需要的。谷歌搜索“php getopt”将产生有用的结果。
您可以将参数作为一个参数发送,然后像 $_GET 数组一样解析该参数
C:\xampp\php\php.exe name.php "inputFirstName=Robby&LastName=John"
在你的 PHP 文件中
if (!empty($argv[1])) {
parse_str($argv[1], $_GET);
}
您将像往常一样在 $_GET 数组中获得参数
getopt()
函数可能是该问题中最正确的答案。特别是因为 PHP 5.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:"
) 表示这是必需的参数。如果这里没有冒号,则只会检测到参数的存在,而不是实际值(PHP 手册中的更多信息)。在第三行将这两个数组合并在一起会产生数组,其中所有预期参数都使用默认值或命令行/终端提供的参数(如果可用)进行设置。
我不知道当时是否有人问过这个问题,我要回答什么是可用的,但如果你打电话
php-cgi -f myfile.php var=something
,你可以从命令行检索$var=$_GET['var'];
,那么你不必更改您从网络浏览器或命令行调用它的代码
如果你不介意使用库,我建议你看一下 Symfony 的控制台组件。
它可用于创建命令行应用程序并支持使用参数和选项。
文档页面包含一些出色的示例来帮助您入门。
当然,它在幕后使用了 vascowhite 所解释的相同技术。
您最大的希望是使用
exec("php -f php.file.php example=js.json > ech0");
echo file_get_contents("ech0");
unlink("ech0");
这就是我在 PipesJS
中使用的您可以解析程序上的用户输入,查找特定字符串,例如
-inputFirstName="x"
(例如,使用正则表达式),然后将正确的变量设置为 x。