一起了解PHP中YaConf擴充套件的使用

硬核專案經理發表於2021-12-01

上篇文章我們介紹了一個比較出名的 YAML 格式的配置檔案相關的操作,今天我來學習另外一個配置檔案擴充套件。這個配置檔案的寫法其實與 php.ini 的這種 PHP 標準的配置格式比較類似,但是又有一些不同。不過內容非常簡單,大家僅供參考。

Yaconf 配置檔案及格式

Yaconf 從名字是不是看出什麼端倪了?沒錯,和 Yaf 、Yac 一樣,又是我們鳥哥的作品。不得不說大神還是為我們貢獻了很多很好的作品哦。後面我們還會講一個它的小眾開源擴充套件,而 Yaf 擴充套件我們將在未來學習框架的時候再深入地進行學習。

Yaconf 的安裝也是普通地擴充套件安裝的方式,不過它需要 PHP7 以上的版本。另外,在安裝之後還需要在 php.ini 檔案中指定 yaconf.directory ,也就是配置檔案存放的目錄。這個屬性是不能通過 ini_set() 配置的,也就是必須在程式執行前就載入到 PHP 執行環境中。我們按照文件的說明將它配置為 /tmp/conf ,然後在這個目錄下建立自己需要的配置檔案就可以了。

Yaconf 的語法非常簡潔,鳥哥的作品都主打效能,所以 Yaconf 也是一個高效能的配置管理擴充套件。關於 Yaconf 的具體介紹可以檢視文章最下方第二條連結的說明,在這裡我們就看一些它的語法以及具體的使用。

foo="bar"
phpversion=PHP_VERSION
env=${HOME}

arr.0=1
arr.1=2
arr[]=3
arr[3]=4

map.foo=bar
map.bar=foo
map.foo.name=yaconf

看出來什麼特點了嗎?首先,如果是帶雙引號的內容,會將這個配置變數當成字串,如果不是雙引號的,則會嘗試以 PHP 來進行解析。然後陣列和 HashMap 這樣的寫法也都是完美支援的。似乎是比 php.ini 的寫法強悍了一些。不過還不止。

[parent]
parent="base"
children="NULL"
[children : parent]
children="children"

嗯,你沒看錯,它還可以支援這樣的繼承寫法,中括號標示的內容可以看作是一個配置片斷,或者說一節內容,具體作用我們後面會看到。

獲取配置內容

配置語法就是這些,接下來我們要具體看看這些配置資訊要怎麼讀取出來。這個擴充套件其實就提供了兩個函式,一個用於讀取,一個用於查詢配置是否存在,我們先來看一下如何讀取資料。

var_dump(Yaconf::get("test.foo")); // string(3) "bar"
var_dump(Yaconf::get("test.phpversion")); // string(5) "7.4.4"
var_dump(Yaconf::get("test.env")); // string(5) "/root"

這個函式相信不用多解釋了,test 是我們的檔名,也就是在 /tmp/conf/test.ini 這個檔案中,我們把上面的測試配置資訊寫在了這個配置裡面。當然,我們也可以在這個目錄中定義更多的配置檔案,比如我們另外定義了一個配置檔案 foo.ini ,那麼就可以這麼讀取:

var_dump(Yaconf::get("foo.SectionA.key")); // string(3) "val"

對於陣列配置資訊來說,直接獲取到的內容返回的就是陣列格式的。

var_dump(Yaconf::get("test.arr"));
// array(4) {
//     [0]=>
//     string(1) "1"
//     [1]=>
//     string(1) "2"
//     [2]=>
//     string(1) "3"
//     [3]=>
//     string(1) "4"
//   }

var_dump(Yaconf::get("test.arr.1")); // string(1) "2"

var_dump(Yaconf::get("test.map"));
// array(2) {
//     ["foo"]=>
//     array(1) {
//       ["name"]=>
//       string(6) "yaconf"
//     }
//     ["bar"]=>
//     string(3) "foo"
//   }

var_dump(Yaconf::get("test.map.foo.name")); // string(6) "yaconf"

在獲取陣列內部的資料時,我們直接使用 . 來獲取序列的內容就可以了。最後就是上面提到過的分片和繼承的功能。

var_dump(Yaconf::get("test.parent.parent")); // string(4) "base"
var_dump(Yaconf::get("test.children.parent")); // string(4) "base"

var_dump(Yaconf::get("test.parent.children")); // string(4) "NULL"
var_dump(Yaconf::get("test.children.children")); // string(8) "children"

test 是檔名,而 parent 就是我們定義在中括號裡面的分片名稱,接著繼續點分片下面定義的配置項的名稱就可以獲取到這個分片下面的配置資訊內容了。而繼承的使用相信從程式碼中大家也看出來了,parent 的 parent 配置項被 children 繼承後,children 中不需要再定義這個配置項就可以直接獲取到父級中定義過的這個配置項內容。而 children 中重寫了 children 這個配置項,所以在 children 分片中的 children 配置項顯示的就是它自己定義的內容。

檢測配置資訊是否存在

前面說過這個擴充套件中一共就兩個方法,第二個就是用於檢測配置項是否存在的一個方法,非常簡單。

var_dump(Yaconf::has("test.foo")); // bool(true)
var_dump(Yaconf::has("test.baz")); // bool(false)

總結

說實話,這個配置擴充套件也並不是非常常見的一個擴充套件應用。因為大家目前在使用的框架不管是 Laravel 還是 TP 都會有它們自己的一套配置檔案格式及操作。當然,如果說你是鳥哥的忠粉或者本身公司系統是架構在 Yaf 、Yac 、Yar 之上的話,那麼加上這個 Yaconf 的話就可以看作是一整套完整的高效能內部擴充套件架構。它們主打的特點都是效能強悍,畢竟是從底層 C 擴充套件的角度來提供的框架,而不是通過 Composer 來使用 PHP 編寫的框架。這個我們將來在學習和講解框架的時候說不定會拿出來單獨做一個系列哦!

測試程式碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/11.一起了解PHP中YaConf擴充套件的使用.php

參考文件:

https://www.php.net/manual/zh/book.yaconf.php

https://www.laruence.com/2015/06/12/3051.html

相關文章