PHP-Windows中的命令行参数

时间:2020-03-05 18:54:08  来源:igfitidea点击:

我正在尝试在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()命令,它将为我们处理所有这些麻烦的事情。有些。