|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
接触MYSQL,开始设计数据库程序 所以看到这篇文章的时分,我也才方才晓得,本来,还有一个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,这真是一个永久的痛。)告诉你了一个方式,但是缺少努力这一环节,那也是白搭。 |
|