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 相关文章推荐
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
php获得用户ip地址的比较不错的方法
Feb 08 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
PHP中绘制图像的一些函数总结
Nov 19 PHP
PHP将字符分解为多个字符串的方法
Nov 22 PHP
PHP过滤黑名单关键字的方法
Dec 01 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
YII2 实现多语言配置的方法分享
Jan 11 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
onpropertypchange
2006/07/01 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中使用asyncio 封装文件读写
2016/09/11 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python 命令行传入参数实现解析
2019/08/30 Python
基于python监控程序是否关闭
2020/01/14 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
办公室前台岗位职责
2014/01/04 职场文书
社区七一党员活动方案
2014/01/25 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
网络教育自我鉴定
2014/02/04 职场文书
经营管理策划方案
2014/05/22 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL