分享一個(gè)php的冷知識(shí) - 從命令行參數(shù)列表中獲取選項(xiàng)
用到的函數(shù)是getopt
說(shuō)明
函數(shù)簽名是這樣的
getopt ( string $options [, array $longopts [, int &$optind ]] ) : array|bool false
解析傳入腳本的選項(xiàng)寻行,成功返回?cái)?shù)組骡湖,解析失敗返回false
參數(shù)
options
該字符串中的每個(gè)字符會(huì)被當(dāng)做選項(xiàng)字符颈畸,匹配傳入腳本的選項(xiàng)以單個(gè)連字符(-)開(kāi)頭咐旧。 比如蝶涩,一個(gè)選項(xiàng)字符串 "x" 識(shí)別了一個(gè)選項(xiàng) -x鲸湃。 只允許 a-z赠涮、A-Z 和 0-9。longopts
選項(xiàng)數(shù)組暗挑。此數(shù)組中的每個(gè)元素會(huì)被作為選項(xiàng)字符串笋除,匹配了以?xún)蓚€(gè)連字符(--)傳入到腳本的選項(xiàng)。 例如炸裆,長(zhǎng)選項(xiàng)元素 "opt" 識(shí)別了一個(gè)選項(xiàng) --opt垃它。optind
如果存在optind
參數(shù),則參數(shù)解析停止的索引將被寫(xiě)入此變量烹看。
參數(shù)值
options
可能包含了以下元素:
- 單獨(dú)的字符(不接受值)
- 后面跟隨冒號(hào)的字符(此選項(xiàng)需要值)
- 后面跟隨兩個(gè)冒號(hào)的字符(此選項(xiàng)的值可選)
options
和 longopts
的格式幾乎是一樣的国拇,唯一的不同之處是 longopts
需要是選項(xiàng)的數(shù)組(每個(gè)元素為一個(gè)選項(xiàng)),而 options
需要一個(gè)字符串(每個(gè)字符是個(gè)選項(xiàng))惯殊。
例子
說(shuō)了這么多酱吝,我們舉例說(shuō)明吧
1. 基本用法
<?php
// Script 1.php
$options = getopt("h:p:d");
var_dump($options);
?>
命令行下測(cè)試看看
php 1.php -h 127.0.0.1 -p 8000 -d
以上例程會(huì)輸出:
array(3) {
["h"]=>
string(9) "127.0.0.1"
["p"]=>
string(4) "8000"
["d"]=>
bool(false)
}
選項(xiàng)參數(shù)也可以中間不要空格
php 1.php -h 127.0.0.1 -p 8000 -d
php5.3之后還可以使用 "=" 作為 參數(shù)和值的分隔符
php 1.php -h=127.0.0.1 -p=8000 -d
2. 引入長(zhǎng)選項(xiàng)
<?php
// Script 2.php
$shortopts = ""; // 短選項(xiàng) 用字母字符串
$shortopts .= "h:"; // 必選選項(xiàng) 字母后面一個(gè)冒號(hào)
$shortopts .= "p::"; // 可選選項(xiàng) 字母后面兩個(gè)冒號(hào)
$shortopts .= "vd"; // 無(wú)需值的選項(xiàng) 字母后面沒(méi)有冒號(hào)
$longopts = array( // 長(zhǎng)選項(xiàng) 用單詞的數(shù)組
"host:", // 必選選項(xiàng) 單詞后面一個(gè)冒號(hào)
"port::", // 可選選項(xiàng) 單詞后面兩個(gè)冒號(hào)
"version", // 無(wú)需值的選項(xiàng) 單詞后面沒(méi)有冒號(hào)
"debug", // 無(wú)需值的選項(xiàng) 單詞后面沒(méi)有冒號(hào)
);
$options = getopt($shortopts, $longopts);
var_dump($options);
?>
運(yùn)行測(cè)試:
php 2.php -h127.0.0.1 -p8000 -d --host=127.0.0.1 --port=8000 --version --debug
輸出:
array(7) {
["h"]=>
string(9) "127.0.0.1"
["p"]=>
string(4) "8000"
["d"]=>
bool(false)
["host"]=>
string(9) "127.0.0.1"
["port"]=>
string(4) "8000"
["version"]=>
bool(false)
["debug"]=>
bool(false)
}
3. 同一選項(xiàng)可以傳遞多次
運(yùn)行測(cè)試:
php 2.php -d -d --version --debug --port=123 --port=234
輸出:
array(4) {
["d"]=>
array(2) { // 多個(gè)選項(xiàng)參數(shù)值以數(shù)組呈現(xiàn)
[0]=>
bool(false)
[1]=>
bool(false)
}
["version"]=>
bool(false)
["debug"]=>
bool(false)
["port"]=>
array(2) {
[0]=>
string(3) "123"
[1]=>
string(3) "234"
}
}
4. 使用 optind
// Script 3.php
$optind = null;
$opts = getopt('a:b:', [], $optind);
var_dump($argv);
var_dump($optind);
$pos_args = array_slice($argv, $optind); // 從數(shù)組中取出一段
var_dump($pos_args);
運(yùn)行測(cè)試:
php 3.php -a 1 -b 2 -- test
輸出:
array(7) {
[0]=>
string(7) "cli.php"
[1]=>
string(2) "-a"
[2]=>
string(1) "1"
[3]=>
string(2) "-b"
[4]=>
string(1) "2"
[5]=>
string(2) "--"
[6]=>
string(4) "test"
}
int(6) // $optind = 6
array(1) {
[0]=>
string(4) "test"
}
至此以后就可以寫(xiě)出漂亮優(yōu)雅的cli程序了??????