1. 程式人生 > >php在cli模式下取得命令行中的參數的方法-getopt命令行可傳遞數組-簡單自定義方法取命令行參數

php在cli模式下取得命令行中的參數的方法-getopt命令行可傳遞數組-簡單自定義方法取命令行參數

getc pre alt clas opts roo 得到 表示 type

在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命令行可傳遞數組-簡單自定義方法取命令行參數