PHP中 接收命令列引數
阿新 • • 發佈:2019-01-31
1.$argv
PHP 的二進位制檔案(php.exe 檔案)及其執行的 PHP 指令碼能夠接受一系列的引數。PHP 沒有限制傳送給指令碼程式的引數的個數(外殼程式對命令列的字元數有限制,但通常都不會超過該限制)。傳遞給指令碼的引數可在全域性變數 $argv 中獲取。該陣列中下標為零的成員為指令碼的名稱(當 PHP 程式碼來自標準輸入獲直接用 -r 引數以命令列方式執行時,該名稱為“-”)。另外,全域性變數 $argc 存有 $argv 陣列中成員變數的個數(而非傳送給指令碼程式的引數的個數)。
只要傳送給指令碼的引數不是以 - 符號開頭,就無需過多的注意什麼。向指令碼傳送以 - 開頭的引數會導致錯誤,因為 PHP 會認為應該由它自身來處理這些引數。可以用引數列表分隔符 -- 來解決這個問題。在 PHP 解析完引數後,該符號後所有的引數將會被原樣傳送給指令碼程式。
# 以下命令將不會執行 PHP 程式碼,而只顯示 PHP 命令列模式的使用說明:
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# 以下命令將會把“-h”引數傳送給指令碼程式,PHP 不會顯示命令列模式的使用說明:
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
除此之外,還有另一個方法將 PHP 用於外殼指令碼。可以在寫一個指令碼,並在第一行以 #!/usr/bin/php 開頭,在其後加上以 PHP 開始和結尾標記符包含的正常的 PHP 程式碼,然後為該檔案設定正確的執行屬性(例如:chmod +x test)。該方法可以使得該檔案能夠像外殼指令碼或 PERL 指令碼一樣被直接執行。 #!/usr/bin/php
<?php
var_dump($argv);
?>
假設改檔名為 test 並被放置在當前目錄下,可以做如下操作:
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
正如所看到的,在向該指令碼傳送以 - 開頭的引數時,指令碼仍然能夠正常執行。
<?php
echo $argc . "\n";
var_dump($argv);
?>
H:\workspace>php test.php arg1 arg2
3
array(3) {
[0]=>
string(8) "test.php"
[1]=>
string(4) "arg1"
[2]=>
string(4) "arg2"
}
2.getopt
getopt
(PHP 4 >= 4.3.0, PHP 5)
getopt -- Gets options from the command line argument list
Description
array getopt ( string options [, array longopts] )
Returns an associative array of option / argument pairs based on the options format specified in options, or FALSE on an error.
On platforms that have the C function getopt_long, long options can be specified with the parameter longopts (as of PHP 4.3.0).
<?php
// parse the command line ($GLOBALS['argv'])
$options = getopt("f:hp:");
?>
The options parameter may contain the following elements: individual characters, and characters followed by a colon to indicate an option argument is to follow. For example, an option string x recognizes an option -x, and an option string x: recognizes an option and argument -x argument. It does not m