PHP-Windows中的命令行参数
我正在尝试在Windows XP下从命令行运行PHP。
除我无法为PHP脚本提供参数的事实外,该方法行得通。
我的测试用例:
echo "param = ".$param."\n"; var_dump($argv);
我想这样称呼:
php.exe -f test.php -param = test
但是我从来没有让脚本接受我的参数。
我从上面的脚本中得到的结果
`PHP注意:未定义的变量:第2行的C:\ test.php中的param
param = '' array(2) { [0]=> string(8) "test.php" [1]=> string(10) "param=test" }
我正在尝试使用PHP 5.2.6.
这是PHP5中的错误吗?
参数传递在在线帮助中处理
注意:如果需要将参数传递给脚本,则需要在使用-f开关时将-作为第一个参数传递。
这似乎可以在PHP4下工作,但不能在PHP5下工作。
在PHP4下,我可以使用可以在服务器上运行的相同脚本,而无需在命令行上进行任何更改。这对于本地调试非常方便,例如将输出保存在要研究的文件中。
解决方案
回答
我们为什么期望将参数设置为该值?我们负责以所需的方式从$ argv数组中解析命令行。
回答
$ argv是一个包含所有命令行参数的数组...我们需要解析该数组并自己设置$ param。
$tmp = $argv[1]; // $tmp="param=test" $tmp = explode("=", $tmp); // $tmp=Array( 0 => param, 1 => test) $param = $tmp[1]; // $param = "test";
回答
PHP不会为我们参数化命令行参数。请查看输出,其中我们在ARGV中的第二个条目是" param = test"。
我们最可能想要的是使用PEAR包http://pear.php.net/package/Console_CommandLine:"功能齐全的命令行选项和参数解析器"。
或者,我们也可以自虐,添加代码以通过ARGV并自行设置参数。这是一个非常简单的代码片段,可以入门(如果第一部分不是有效的变量名,或者ARGV部分中的'='大于1,则此代码将无效:
foreach($argv as $v) { if(false !== strpos($v, '=')) { $parts = explode('=', $v); ${$parts[0]} = $parts[1]; } }
回答
我们可以执行以下操作:
if($argc > 1){ if($argv[1] == 'param=test'){ $param = 'test'; } }
当然,我们可能会比需要的复杂得多。
回答
The parameter passing is handled in the online help Note: If you need to pass arguments to your scripts you need to pass -- as the first argument when using the -f switch. This seemed to be working under PHP4, but not under PHP5.
但是PHP仍然没有解析这些参数。它只是将它们传递给$ argv数组中的脚本。
使用-的唯一原因是,PHP可以分辨出哪些参数适用于PHP可执行文件以及哪些参数适用于脚本。
这使我们可以执行以下操作:
php -e -n -f myScript.php -- -f -n -e
(将-f,-n和-e传递给myScript.php。之前的-f,-n和-e传递给PHP本身)。
回答
我们可以使用$ argv数组。像这样:
<?php echo $argv[1]; ?>
请记住,$ argv数组的第一个成员(即$ argv [0])是脚本本身的名称,因此,要为应用程序使用参数,应从以下位置开始使用$ argv []的成员第1个索引。
调用应用程序时,请使用以下语法:
php myscript.php -- myValue
无需为参数添加名称。如我们所见,我们在$ argv []上调用了var_dump(),第二个成员(即第一个参数)是字符串PARAM = TEST。正确的?因此,无需为参数命名。只需输入参数值。
回答
我们可以使用类似
if (isset($argv[1]) { $arg1 = $argv[1]; $arg1 = explode("=", $arg1); $param = $arg1[1]; }
(如何处理缺少参数取决于我们)
或者,如果我们需要更复杂的方案,请查看命令行解析器库,例如Pear的库。
使用发布在另一个解决方案中的$ {$ parts [0]} = $ parts [1];
,我们可以覆盖代码中的任何变量,但这听起来并不安全。
回答
如果我们喜欢生活在最前沿,PHP 5.3带有getOpt()命令,它将为我们处理所有这些麻烦的事情。有些。