目錄
- $argv 獲得所有空格分隔的參數(shù)列表
- getopt() 從命令行參數(shù)列表中獲取選項(xiàng)
- 長(zhǎng)選項(xiàng)
- 冒號(hào)規(guī)則
- 選項(xiàng)參數(shù)中斷
- 總結(jié)
使用 PHP 開(kāi)發(fā)的同學(xué)多少都會(huì)接觸過(guò) CLI 命令行。經(jīng)常會(huì)有一些定時(shí)任務(wù)或者一些腳本直接使用命令行處理會(huì)更加的方便,有些時(shí)候我們會(huì)需要像網(wǎng)頁(yè)的 GET 、 POST 一樣為這些命令行腳本提供參數(shù)。比如在針對(duì)某些日期做統(tǒng)計(jì)的腳本,就需要傳遞一個(gè)日期給它,這樣我們就統(tǒng)計(jì)指定日期的一些數(shù)據(jù)。這類需求應(yīng)該非常常見(jiàn),那么,我們都是如何來(lái)接收這些命令行的參數(shù)的呢?今天,就來(lái)介紹一下這方面的內(nèi)容。
$argv 獲得所有空格分隔的參數(shù)列表
這個(gè)變量估計(jì)是大家用得比較多的一個(gè)接參變量了。它是 PHP 為我們準(zhǔn)備好的一個(gè)固定變量,目的就是獲取傳遞給腳本的參數(shù)數(shù)組。
print_r($argv);
// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd
// Array
// (
// [0] => 如何獲取PHP命令行參數(shù).php
// [1] => --a=1
// [2] => -b=2
// [3] => -c=3
// [4] => -d=4
// [5] => --e=5
// [6] => ccc
// [7] => ddd
// )
這個(gè)數(shù)組是以參數(shù)間隔的空格進(jìn)行分隔的。第1個(gè)元素是當(dāng)前運(yùn)行的腳本文件名,也就是說(shuō),不管有沒(méi)有參數(shù),這個(gè)變量一定會(huì)有一個(gè) $argv[0] 表示的是當(dāng)前的腳本文件名。
在日常的開(kāi)發(fā)需求中,其實(shí)使用這個(gè)變量就已經(jīng)夠用了。但是這明顯不會(huì)是我們今天的主題,大家注意到上面的代碼中我們有很多參數(shù)是 -x=xxx 的形式,這種形式的參數(shù)是不是和 Linux 的命令選項(xiàng)非常像,沒(méi)錯(cuò),這就是我們今天要重點(diǎn)介紹的:從命令行參數(shù)列表中獲取選項(xiàng)。
getopt() 從命令行參數(shù)列表中獲取選項(xiàng)
其實(shí)就是這樣一個(gè)簡(jiǎn)單的函數(shù),我們就可以像 Linux 的命令選項(xiàng)一樣獲取指定的命令值。而且不是像 $argv 按空格進(jìn)行分隔,命令選項(xiàng)函數(shù)會(huì)將這些命令選項(xiàng)封裝成數(shù)組,組成以選項(xiàng)名為鍵,以等號(hào)后面的內(nèi)容為值的數(shù)組,更加方便我們的使用。
// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd
print_r(getopt('a:b:c:d:e:f:'));
// Array
// (
// [b] => 2
// [c] => 3
// [d] => 4
// )
是不是很神奇,而且非常直觀吧,我們直接就拿到了 b 、 c 、d 的內(nèi)容并且是格式非常清晰的鍵值數(shù)組形式。有同學(xué)要問(wèn)了,a 和 e 呢?還有后面的 ccc 、 ddd 呢?
首先要說(shuō)明的是,ccc 和 ddd 不是標(biāo)準(zhǔn)的選項(xiàng)參數(shù),也就是說(shuō),這個(gè)函數(shù)接收的內(nèi)容是以 - 開(kāi)頭的選項(xiàng),所以 ccc 和 ddd 不會(huì)在這里輸出,并且需要注意的是,非選項(xiàng)參數(shù)會(huì)中斷選項(xiàng)參數(shù)的獲取,在 ccc 之后如果繼續(xù)添加 - 開(kāi)頭的選項(xiàng)也是無(wú)法獲取到的,這個(gè)我們后面還會(huì)看到。而 -- 開(kāi)頭的選項(xiàng)參數(shù)呢?我們直接看下面的長(zhǎng)選項(xiàng)功能。
長(zhǎng)選項(xiàng)
// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd
print_r(getopt('', ['a:','b:','c:','d:','e:','f:']));
// Array
// (
// [a] => 1
// [e] => 5
// )
沒(méi)錯(cuò),getopt() 函數(shù)的第二個(gè)參數(shù)就是定義這種 -- 開(kāi)頭的長(zhǎng)選項(xiàng)的,而且需要注意的是,第一個(gè)參數(shù)是字符串類型,第二個(gè)長(zhǎng)選項(xiàng)參數(shù)是數(shù)組類型的。那么我們把它們結(jié)合起來(lái),就當(dāng)然可以獲取到全部的參數(shù)信息啦!
// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd
print_r(getopt('a:b:c:d:e:f:', ['a:','b:','c:','d:','e:','f:']));
// Array
// (
// [a] => 1
// [b] => 2
// [c] => 3
// [d] => 4
// [e] => 5
// )
OK,參數(shù)選項(xiàng)獲取沒(méi)問(wèn)題了吧,細(xì)心的同學(xué)肯定又發(fā)現(xiàn)了一個(gè)問(wèn)題,這個(gè) getopt() 函數(shù)的參數(shù)中定義的選項(xiàng)名稱后面為啥都要加個(gè)冒號(hào)?這就涉及到我們的冒號(hào)規(guī)則了,請(qǐng)直接往下看。
冒號(hào)規(guī)則
getopt() 的前兩個(gè)參數(shù)都支持一套關(guān)于選項(xiàng)獲取的規(guī)則:
- 單獨(dú)的字符(不接受值)
- 后面跟隨冒號(hào)的字符(此選項(xiàng)需要值)
- 后面跟隨兩個(gè)冒號(hào)的字符(此選項(xiàng)的值可選)
我們還是直接通過(guò)代碼來(lái)看一下。
// 一
// php 如何獲取PHP命令行參數(shù).php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd
print_r(getopt('abcdef'));
// Array
// (
// [b] =>
// [c] =>
// [d] =>
// )
// 二
// php 如何獲取PHP命令行參數(shù).php -f
print_r(getopt('f::'));
// Array
// (
// [f] =>
// )
print_r(getopt('f:'));
// Array
// (
// )
// 三
// php 如何獲取PHP命令行參數(shù).php -f 22
print_r(getopt('f::'));
// Array
// (
// [f] =>
// )
print_r(getopt('f:'));
// Array
// (
// [f] => 22
// )
// 四
// php 如何獲取PHP命令行參數(shù).php -f=22
print_r(getopt('f::'));
// Array
// (
// [f] => 22
// )
print_r(getopt('f:'));
// Array
// (
// [f] => 22
// )
這一段比較長(zhǎng),我們一塊一塊來(lái)看。首先是不帶冒號(hào)的 abcdef 寫(xiě)法,返回的數(shù)組中都包含鍵,但沒(méi)有值,對(duì)應(yīng)上面的規(guī)則就是不接受這些參數(shù)選項(xiàng)的值,你傳了這些參數(shù)選項(xiàng)也是只有鍵名而內(nèi)容是空的。
第二段是定義了一個(gè)參數(shù),但是不給值,這時(shí),雙冒號(hào) :: 會(huì)有鍵名,而單冒號(hào) : 則什么都沒(méi)有。
第三段是空格形式的選項(xiàng)值,雙冒號(hào) :: 有鍵名但沒(méi)有值,單冒號(hào) : 鍵值正常。
第四段是等號(hào) = 形式的選項(xiàng)值,單雙冒號(hào)都正常接收到鍵值。
選項(xiàng)參數(shù)中斷
上文中我們提到過(guò)參數(shù)中斷的問(wèn)題,就是在選項(xiàng)參數(shù)之后如果有一個(gè)非選項(xiàng)參數(shù)的參數(shù)出現(xiàn),getopt() 就無(wú)法再獲取到這個(gè)非選項(xiàng)參數(shù)后面的所有內(nèi)容了。
// php 如何獲取PHP命令行參數(shù).php -f=22 aa -b=33
// 選項(xiàng)的解析會(huì)終止于找到的第一個(gè)非選項(xiàng),之后的任何東西都會(huì)被丟棄。
// Array
// (
// [f] => 22
// )
通過(guò)這個(gè)測(cè)試可以清晰的看出后面的 b 選項(xiàng)無(wú)法獲取。這時(shí),如果我們想知道選項(xiàng)參數(shù)在什么地方或者因?yàn)槟膫€(gè)參數(shù)而中斷的話,就可以使用 getopt() 函數(shù)的第三個(gè)參數(shù)了。
// php 如何獲取PHP命令行參數(shù).php -f=22 aa -b=33
$optind = null;
getopt('f:b:', [], $optind);
echo $optind, PHP_EOL; // 返回中斷位置的索引值,2
echo $argv[$optind], PHP_EOL; // 等同于 $argv 的索引順序,aa
注釋已經(jīng)寫(xiě)得很清晰了,第三個(gè)參數(shù)會(huì)回調(diào)一個(gè)參數(shù)選項(xiàng)中斷位置的索引,并且這個(gè)索引是和 $argv 的索引順序位置一致的。
總結(jié)
說(shuō)實(shí)話,在沒(méi)看文檔前真的只知道有一個(gè) $argv 變量可以用來(lái)獲取命令行腳本的參數(shù),通過(guò)這次學(xué)習(xí)才發(fā)現(xiàn)原來(lái)還有一個(gè)這么強(qiáng)大的選項(xiàng)參數(shù)函數(shù)。學(xué)習(xí)的過(guò)程非常簡(jiǎn)單,如何運(yùn)用到真實(shí)的項(xiàng)目中才是關(guān)鍵所在,加油學(xué)習(xí),努力實(shí)踐吧!
測(cè)試代碼:
github.com/zhangyue050…
以上就是PHP如何獲取命令行參數(shù)的詳細(xì)內(nèi)容,更多關(guān)于PHP 獲取命令行參數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- php命令行模式代碼實(shí)例詳解
- php web環(huán)境和命令行環(huán)境下查找php.ini的位置
- php根據(jù)命令行參數(shù)生成配置文件詳解
- php命令行寫(xiě)shell實(shí)例詳解
- 命令行執(zhí)行php腳本中的$argv和$argc配置方法
- 利用PHP命令行模式采集股票趨勢(shì)信息
- 基于命令行執(zhí)行帶參數(shù)的php腳本并取得參數(shù)的方法
- php生成curl命令行的方法
- 實(shí)例講解yii2.0在php命令行中運(yùn)行的步驟
- 如何通過(guò)Linux命令行使用和運(yùn)行PHP腳本
- PHP的命令行擴(kuò)展Readline相關(guān)函數(shù)的使用