php INI配置文件的解析实现分析


Posted in PHP onJanuary 04, 2011

所以看到这篇文章的时候,我也才刚刚知道,原来,还有一个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:

<?php 
class DbaReader implements Iterator 
{ protected $db = NULL; 
private $key = false; 
private $val = false; 
/** 
* Open database $file with $handler in read only mode. 
* 
* @param file Database file to open. 
* @param handler Handler to use for database access. 
*/ 
function __construct($file, $handler) { 
if (!$this->db = dba_open($file, 'r', $handler)) { 
throw new exception('Could not open file ' . $file); 
} 
} 
/** 
* Close database. 
*/ 
function __destruct() { 
dba_close($this->db); 
} 
/** 
* Rewind to first element. 
*/ 
function rewind() { 
$this->key = dba_firstkey($this->db); 
$this->fetch_data(); 
} 
/** 
* Move to next element. 
* 
* @return void 
*/ 
function next() { 
$this->key = dba_nextkey($this->db); 
$this->fetch_data(); 
} 
/** 
* Fetches the current data if $key is valid 
*/ 
private function fetch_data() { 
if ($this->key !== false) { 
$this->val = dba_fetch($this->key, $this->db); 
} 
} 
/** 
* @return Current data. 
*/ 
function current() { 
return $this->val; 
} 
/** 
* @return Whether more elements are available. 
*/ 
function valid() { 
if ($this->db && $this->key !== false) { 
return true; 
} else { 
return false; 
} 
} 
/** 
* @return Current key. 
*/ 
function key() { 
return $this->key; 
} 
} 
?>

DbaReader使用Iterator接口,当然要实现里面的5个迭代方法。迭代方法对handlerhandlerINI文件的解析,用到了dba扩展。

说点题外话,什么是Dba?为什么使用Dba?
Dba是一款数据库,确切点说,是一款索引化的文件存储系统。适合相对比较静态的索引化的数据存储。所有版本的Linux都会带此数据库。
既然使用文件来存储数据,为什么还有使用Dba呢?原因有二:
1数据记录的存储长度可以不是固定的;
2使用索引存储和检索数据。

DbaReader提供一个访问INI文件数据的迭代方法,如果需要存储删除数据呢?所以DbaArray在继承DbaReader的基础上,实现了此功能。

<?php 
class DbaArray extends DbaReader implements ArrayAccess 
{ /** 
* Open database $file with $handler in read only mode. 
* 
* @param file Database file to open. 
* @param handler Handler to use for database access.取值http://www.php.net/manual/en/dba.requirements.php 
*/ 
function __construct($file, $handler) 
{ 
$this->db = dba_popen($file, "c", $handler); 
if (!$this->db) { 
throw new exception("Databse could not be opened"); 
} 
} 
/** 
* Close database. 
*/ 
function __destruct() 
{ 
parent::__destruct(); 
} 
/** 
* Read an entry. 
* 
* @param $name key to read from 
* @return value associated with $name 
*/ 
function offsetGet($name) 
{ 
$data = dba_fetch($name, $this->db); 
if($data) { 
if (ini_get('magic_quotes_runtime')) { 
$data = stripslashes($data); 
} 
//return unserialize($data); 
return $data; 
} 
else 
{ 
return NULL; 
} 
} 
/** 
* Set an entry. 
* 
* @param $name key to write to 
* @param $value value to write 
*/ 
function offsetSet($name, $value) 
{ 
//dba_replace($name, serialize($value), $this->db); 
dba_replace($name, $value, $this->db); 
return $value; 
} 
/** 
* @return whether key $name exists. 
*/ 
function offsetExists($name) 
{ 
return dba_exists($name, $this->db); 
} 
/** 
* Delete a key/value pair. 
* 
* @param $name key to delete. 
*/ 
function offsetUnset($name) 
{ 
return dba_delete($name, $this->db); 
} 
} 
?>

使用范例
构建文件text.ini,内容如下:
host = localhost 
password = password 
database = data

文件index.php.代码如下:
<?php 
function loadClass($class) 
{ 
require_once __DIR__.DIRECTORY_SEPARATOR.$class.'.php'; 
} 
spl_autoload_register('loadClass',false); $iniFile = __DIR__.DIRECTORY_SEPARATOR.'test.ini'; 
$ini = new DbaArray($iniFile,'iniFile'); 
echo $ini['database']; 
var_dump($ini); 
?>

--EOF--

看完上面这一段,是不是有什么想法?原来ini的操作也是这么的方便?不过,如果是纯读取的话,我还是比较推荐于parse_ini_file之类的(突然间忘了,如果编码不一样怎么办?ansi/utf-8,这真是一个永恒的痛。)

PHP 相关文章推荐
建站常用13种PHP开源CMS比较
Aug 23 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
May 31 PHP
解析PHP 使用curl提交json格式数据
Jun 29 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
destoon复制新模块的方法
Jun 21 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
PHP根据两点间的经纬度计算距离
Oct 31 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
thinkphp 框架数据库切换实现方法分析
May 18 PHP
PHP strncasecmp字符串比较的小技巧
Jan 04 #PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 #PHP
array_multisort实现PHP多维数组排序示例讲解
Jan 04 #PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 #PHP
PHP 设置MySQL连接字符集的方法
Jan 02 #PHP
php array_unique之后json_encode需要注意
Jan 02 #PHP
从php核心代码分析require和include的区别
Jan 02 #PHP
You might like
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
SeaJS入门教程系列之完整示例(三)
2014/03/03 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
Python基于DES算法加密解密实例
2015/06/03 Python
python实现简易云音乐播放器
2018/01/04 Python
django数据库自动重连的方法实例
2019/07/21 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
python 决策树算法的实现
2020/10/09 Python
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
就业推荐表自我鉴定范文
2014/03/21 职场文书
中学生家长评语大全
2014/04/16 职场文书
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
ktv筹备计划书
2014/05/03 职场文书
企业宣传工作方案
2014/06/02 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
党员年终个人总结
2015/02/14 职场文书
工程技术员岗位职责
2015/04/11 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
交通安全月活动总结
2015/05/08 职场文书
Django操作cookie的实现
2021/05/26 Python