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下escape解码函数的实现方法
Aug 08 PHP
php汉字转拼音的示例
Feb 27 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
PHP实现的曲线统计图表示例
Nov 10 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
PHP终止脚本运行三种实现方法详解
Sep 01 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
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python中列表(list)操作方法汇总
2014/08/18 Python
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
Python中super函数的用法
2017/11/17 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
家长建议怎么写
2014/05/15 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
大学军训口号大全
2015/12/24 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
用Python实现Newton插值法
2021/04/17 Python
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫