所以看到這篇文章的時候,我也才剛知道,原來,還有一個dba的函數可以用,嗯,仔細看了一下dba這個函數的installtion,發現支援inifile也是從PHP5才開始實現的。好吧,對應的dba相關的可以看看這裡:http://www.php.net/manual/en/dba.installation.php,詳細的還是看這裡吧:http://www.php.net/ manual/en/book.dba.php
OK,上原文,它來自於:http://www.cardii.net/php-spl-parse-ini-file/。
曾經介紹過SPL的各型別介面和迭代器。今天,在瀏覽PHP原始碼目錄時,發現有個解析INI檔案的例子,覺得不錯,於是整理了一個實例,拿來分享下。
在PHP應用程式中,設定檔不可或缺,特別是商城,CMS之類的產品,不同的客戶需求不同,當然,不會每個客戶開發一套程序,好辦法的是每個客戶有一套不同的設定檔。適合做設定檔的我曾經也說過,主要有四個類別:PHP陣列(幾乎其他的設定方法最終都是解析成為PHP陣列),XML,YAML和 INI。今天只講INI檔。 ZendFramework使用此配置。
下看個DbaReader類別。檔案名稱為DbaReader.php:
複製程式碼 程式碼如下:
class DbaReader implements Iterator
class DbaReader implements Iterator 🎜>{
protected $db = NULL;
private $key = false;
private $val = false;
/**
* 使用 $handler 以唯讀模式開啟資料庫 $file。
*
* @param file 要開啟的資料庫檔案。
* @param handler 用於資料庫存取的處理程序。
*/
function __construct($file, $handler) {
if (!$this->db = dba_open($file, 'r', $handler)) {
throw new exception('Could not open file ' . $file);
}
}
/**
* 關閉資料庫。
*/
function __destruct() {
dba_close($this->db);
}
/**
* 快退到第一個元素。
*/
function rewind() {
$this->key = dba_firstkey($this->db);
$this->fetch_data();
}
/**
* 移至下一個元素。
*
* @return void
*/
function next() {
$this->key = dba_nextkey($this->db);
$this->fetch_data();
}
/** *
* 如果 $key 有效,則取得目前資料
*/
private function fetch_data() {
if ($this->key !== false) {
$this->val = dba_fetch($this->key, $this ->db);
}
}
/**
* @return 目前資料。
*/
function current() {
return $this->val;
}
/ **
* @return 是否有更多元素可用。
*/
function valid() {
if ($this->db && $this->key !== false) {
return true;
} else {
return false;
}
}
/**
* @return 目前金鑰。
*/
function key() {
return $this->key;
}
}
?>
複製程式碼
程式碼如下:
class DbaArray 擴充DbaReader 實作ArrayAccess
{
/**
* 使用 $handler 以唯讀模式開啟資料庫 $file。
*
* @param file 要開啟的資料庫檔案。
* @param handler 用於資料庫存取的處理程序。取值http://www.php.net/manual/en/dba.requirements.php
*/
function __construct($file, $handler)
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
> 🎜>$this->db = dba_popen($file, "c", $handler);
if (!$this->db) {
拋出新例外("資料庫無法開啟");
}
}
/**
* 關閉資料庫。
*/
函數__destruct()
{
parent::__destruct();
}
/**
* 閱讀條目。
*
* @param $name 鍵讀取
* @return 與 $name
相關的值*/
function offsetGet($name)
{
$data = dba_fetch($name, $this->db);
if($data) {
if ( ini_get('magic_quotes_runtime')) {
$data = stripslashes($data);
}
//傳回反序列化($data);
回傳$資料;
}
否則
{
回傳NULL;
}
}
/**
* 設定一個條目。
*
* @param $name 要寫入的鍵
* @param $value 要寫入的值
*/
function offsetSet($name, $value)
{
{
//dba_replace($name, serialize($value) , $this->db);
* @return key $name 是否存在。 */ function offsetExists($name) { return dba_exists($name, $this->db);
}/**
* 刪除鍵/值對。
*
* @param $name 要刪除的鍵。
*/
} } ? >
使用範例建立檔案text.ini,內容如下:
複製程式碼
程式碼如下:
host = localhost
password = 密碼
database = data