
分享一個php的冷知識 - ,從命令行參數列表中獲取選項
用到的函數是getopt
說明
函數簽名是這樣的
getopt ( string $options [, array $longopts [, int &$optind ]] ) : array|bool false
解析傳入腳本的選項,成功返回數組,解析失敗返回false
參數
options
該字符串中的每個字符會被當做選項字符,匹配傳入腳本的選項以單個連字符(-)開頭。 比如,一個選項字符串 "x" 識別了一個選項 -x。 只允許 a-z、A-Z 和 0-9。longopts
選項數組。此數組中的每個元素會被作為選項字符串,匹配了以兩個連字符(--)傳入到腳本的選項。 例如,長選項元素 "opt" 識別了一個選項 --opt。optind
如果存在optind
參數,則參數解析停止的索引將被寫入此變量。
參數值
options
可能包含了以下元素: - 單獨的字符(不接受值) - 后面跟隨冒號的字符(此選項需要值) - 后面跟隨兩個冒號的字符(此選項的值可選)
options
和 longopts
的格式幾乎是一樣的,唯一的不同之處是 longopts
需要是選項的數組(每個元素為一個選項),而 options
需要一個字符串(每個字符是個選項)。
例子
說了這么多,我們舉例說明吧
1. 基本用法
<?php
// Script 1.php
$options = getopt("h:p:d");
var_dump($options);
?>
命令行下測試看看
php 1.php -h 127.0.0.1 -p 8000 -d
以上例程會輸出:
array(3) {["h"]=>string(9) "127.0.0.1"["p"]=>string(4) "8000"["d"]=>bool(false)
}
選項參數也可以中間不要空格
php 1.php -h 127.0.0.1 -p 8000 -d
php5.3之后還可以使用 "=" 作為 參數和值的分隔符
php 1.php -h=127.0.0.1 -p=8000 -d
2. 引入長選項
<?php
// Script 2.php
$shortopts = ""; // 短選項 用字母字符串
$shortopts .= "h:"; // 必選選項 字母后面一個冒號
$shortopts .= "p::"; // 可選選項 字母后面兩個冒號
$shortopts .= "vd"; // 無需值的選項 字母后面沒有冒號$longopts = array( // 長選項 用單詞的數組"host:", // 必選選項 單詞后面一個冒號"port::", // 可選選項 單詞后面兩個冒號"version", // 無需值的選項 單詞后面沒有冒號"debug", // 無需值的選項 單詞后面沒有冒號
);$options = getopt($shortopts, $longopts);
var_dump($options);
?>
運行測試:
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. 同一選項可以傳遞多次
運行測試:
php 2.php -d -d --version --debug --port=123 --port=234
輸出:
array(4) {["d"]=>array(2) { // 多個選項參數值以數組呈現[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); // 從數組中取出一段
var_dump($pos_args);
運行測試:
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"
}
至此以后就可以寫出漂亮優雅的cli程序了
參考
- https://www.php.net/manual/zh/function.getopt.php