淺談PHP中取得命令列參數的方法
在PHP CLI 命令列中,有需要像網頁的 GET 、 POST 一樣為命令列腳本提供參數;那麼如何取得這些命令列的參數呢?下面這篇文章就來帶大家了解PHP中取得命令列參數的方法,介紹一下$argv變數和getopt()函數。
$argv 得到所有空格分隔的參數列表
這個變數估計是大家用得比較多的一個接參變量了。它是 PHP 為我們準備的固定變量,目的就是要取得傳遞給腳本的參數數組。
print_r($argv); // php 如何获取PHP命令行参数.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd // Array // ( // [0] => 如何获取PHP命令行参数.php // [1] => --a=1 // [2] => -b=2 // [3] => -c=3 // [4] => -d=4 // [5] => --e=5 // [6] => ccc // [7] => ddd // )
這個陣列是以參數間隔的空格分隔的。第1個元素是目前運行的腳本檔名,也就是說,不管有沒有參數,這個變數一定會有一個 $argv[0] 表示的是目前的腳本檔名。
在日常的開發需求中,其實使用這個變數就已經夠用了。但這明顯不會是我們今天的主題,大家注意到上面的程式碼中我們有很多參數是-x=xxx 的形式,這種形式的參數是不是和Linux 的命令選項非常像,沒錯,這就是我們今天要重點介紹的:從命令列參數清單中取得選項。
getopt() 從命令列參數清單中取得選項
#其實就是這樣簡單的函數,我們就可以像Linux 的指令選項一樣取得指定的指令值。而且不是像 $argv 按空格進行分隔,命令選項函數會將這些命令選項封裝成數組,組成以選項名為鍵,以等號後面的內容為值的數組,更加方便我們的使用。
// php 如何获取PHP命令行参数.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 的內容並且是格式非常清晰的鍵值數組形式。有同學要問了,a 和 e 呢?還有後面的 ccc 、 ddd 呢?
首先要說明的是,ccc 和ddd 不是標準的選項參數,也就是說,這個函數接收的內容是以- 開頭的選項,所以ccc 和ddd 不會在這裡輸出,並且需要注意的是,非選項參數會中斷選項參數的獲取,在ccc 之後如果繼續添加- 開頭的選項也是無法獲取到的,這個我們後面還會看到。而 -- 開頭的選項參數呢?我們直接看下面的長選項功能。
長選項
// php 如何获取PHP命令行参数.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 // )
沒錯,getopt() 函數的第二個參數就是定義這種-- 開頭的長選項的,而且需要注意的是,第一個參數是字串類型,第二個長選項參數是陣列類型的。那我們把它們結合起來,就當然可以取得到全部的參數資訊啦!
// php 如何获取PHP命令行参数.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,參數選項取得沒問題了吧,細心的同學一定又發現了一個問題,這個 getopt() 函數的參數中定義的選項名稱後面為啥都要加個冒號?這就牽涉到我們的冒號規則了,請直接往下看。
冒號規則
getopt() 的前兩個參數都支援一套關於選項取得的規則:
- 單獨的字符(不接受值)
- 後面跟著冒號的字元(此選項需要值)
- 後面跟隨兩個冒號的字元(此選項的值可選)
#我們還是直接透過程式碼來看一下。
// 一 // php 如何获取PHP命令行参数.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('abcdef')); // Array // ( // [b] => // [c] => // [d] => // ) // 二 // php 如何获取PHP命令行参数.php -f print_r(getopt('f::')); // Array // ( // [f] => // ) print_r(getopt('f:')); // Array // ( // ) // 三 // php 如何获取PHP命令行参数.php -f 22 print_r(getopt('f::')); // Array // ( // [f] => // ) print_r(getopt('f:')); // Array // ( // [f] => 22 // ) // 四 // php 如何获取PHP命令行参数.php -f=22 print_r(getopt('f::')); // Array // ( // [f] => 22 // ) print_r(getopt('f:')); // Array // ( // [f] => 22 // )
這一段比較長,我們一塊一塊來看。首先是不帶冒號的 abcdef 寫法,傳回的陣列中都包含鍵,但沒有值,對應上面的規則就是不接受這些參數選項的值,你傳了這些參數選項也是只有鍵名而內容是空的。
第二段是定義了一個參數,但是不給值,這時,雙冒號 :: 會有鍵名,而單冒號 : 則什麼都沒有。
第三段是空格形式的選項值,雙冒號 :: 有鍵名但沒有值,單冒號 : 鍵值正常。
第四段是等號 = 形式的選項值,單雙冒號都正常接收到鍵值。
選項參數中斷
上文中我們提到參數中斷的問題,就是在選項參數之後如果有一個非選項參數的參數出現,getopt()就無法再取得這個非選項參數後面的所有內容了。
// php 如何获取PHP命令行参数.php -f=22 aa -b=33 // 选项的解析会终止于找到的第一个非选项,之后的任何东西都会被丢弃。 // Array // ( // [f] => 22 // )
透過這個測驗可以清楚的看出後面的 b 選項無法取得。這時,如果我們想知道選項參數在什麼地方或因為哪個參數而中斷的話,就可以使用 getopt() 函數的第三個參數了。
// php 如何获取PHP命令行参数.php -f=22 aa -b=33 $optind = null; getopt('f:b:', [], $optind); echo $optind, PHP_EOL; // 返回中断位置的索引值,2 echo $argv[$optind], PHP_EOL; // 等同于 $argv 的索引顺序,aa
註解已經寫得很清楚了,第三個參數會回呼一個參數選項中斷位置的索引,而這個索引是和 $argv 的索引順序位置一致的。
總結
說實話,在沒看文件前真的只知道有一個$argv 變數可以用來取得命令列腳本的參數,透過這次學習才發現原來還有一個這麼強大的選項參數函數。學習的過程非常簡單,如何運用到真實的專案中才是關鍵所在,加油學習,努力實踐吧!
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96PHP%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.php
推荐学习:《PHP视频教程》
以上是淺談PHP中取得命令列參數的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
