php在cli模式下取得命令行中的參數的方法-getopt命令行可傳遞數組-簡單自定義方法取命令行參數
在cli模式下執行PHP時,自動給腳本文件傳遞了一個變量$argv,其值即是一個命令中所有值組成的數組(以空格區分),在PHP程序中接收參數有3種方法
1.直接使用argv變量數組。
2.使用$_SERVER[‘argv‘]全局變量來獲取,其值和1是一樣的。
3.使用getopt方法
#getopt方法格式 array getopt ( string $options [, array $longopts ] )
options:該字符串中的每個字符會被當做選項字符,匹配傳入腳本的選項以單個連字符(-)開頭。 選項字符串只允許 a-z、A-Z 和 0-9。
示例:print_r(getopt(‘a:b::c‘));將會得到一個數組,其後面的冒號規則如下:
?單獨的字符(不接受值)
?後面跟隨冒號的字符(此選項需要值)
?後面跟隨兩個冒號的字符(此選項的值可選)
所以:getopt(‘a:b::c‘)即表示a是需要的值,b是可選值,c是不要的值(傳了也置空)
註:選項的值是字符串後的第一個參數。它不介意值之前是否有空格。
PHP程序示例:
<?php print_r(getopt(‘a:b::c‘)); echo "\n--------------------\n";
入參命令及顯示結果:你會發現也有一些現象:
[root@123 ~]# php a.php -a=1 -b=5 -c=6 -d=4 Array ( [a] => 1 [b] => 5 [c] => ) -------------------- #結果:遇到不接受的c後,後面的參數都不會再處理。 [root@123 ~]# php a.php -a 1 -b=5 -c=6 -d=4 Array ( [a]=> 1 [b] => 5 [c] => ) -------------------- [root@123 ~]# php a.php -a 1 -b5 -c=6 -d=4 Array ( [a] => 1 [b] => 5 [c] => ) -------------------- [root@123 ~]# php a.php -a 1 -b 5 -c=6 -d=4 Array ( [a] => 1 [b] => ) -------------------- #為什麽上面的-b後面用空格會導致b取不到結果?文檔明明寫著=和空格都是可以的。#我試驗感覺有這麽一個規律:最後一個值不能和參數有空格。
寫到這裏我真感覺這不是一個什麽好方法!真夠麻煩的,而且這個單字符傳參沒可讀性,不過還是提一下,我在使用的時候發現命令行裏還可以傳遞數組的,比如你可以傳遞-a=1後,再接著傳一個-a=5,則得到的-a自動變成一個二維數組,包含兩個值。不過覺得意義不大。接下來再看longopts:
longopts:選項數組。此數組中的每個元素會被作為選項字符串,匹配了以兩個連字符(--)傳入到腳本的選項。因為options只允許單個字符,而這在程序中沒有什麽可讀性,當然不可取。所以有必要使用longopts。
options 和 longopts 的格式幾乎是一樣的,唯一的不同之處是 longopts 需要是選項的數組(每個元素為一個選項)
PHP程序示例:
<?php print_r(getopt(‘‘,array(‘type:‘)));
結果示例:
[root@123 ~]# php a.php --id 101 --type=1 --age=4 Array ( [id] => 101 [type] => 1 [age] => ) -------------------- [root@123 ~]# php a.php --id 101 --type 1 --age=4 Array ( [id] => 101 [type] => ) -------------------- #仍是一樣:最後一個值不能和參數有空格。
真心覺得longopts一樣也是一個麻煩的東西,真不知道getopt有什麽賣點,既然$argv能取到值那麽在PHP裏使用一個方法一下子就得到鍵值不就行了。於是我試著用這麽一個方法:
<?php function getClientArgs() { global $argv; array_shift($argv); $args = array(); array_walk($argv, function($v ,$k) use(&$args){ @list($key, $value) = @explode(‘=‘, $v); $args[$key] = $value; }); return $args; } $args = getClientArgs(); print_r($args);
然後在命令行中執行:顯示如下,這樣是不是更簡潔明了?
[root@123 ~]# php test2.php id=4 type=1001 age=25 Array ( [id] => 4 [type] => 1001 [age] => 25 )
例子:
php在cli模式下取得命令行中的參數的方法-getopt命令行可傳遞數組-簡單自定義方法取命令行參數