PHPIni解析类 Beta – PHP修改删除增加配置文件
本类具有以下优点:
1.实现了与win编程下几乎相同的ini文件操作
2.安全性高,与平时使用的php的数组存取方式一样。不会被下载。
3.以前的config.php都得手工手改。本类实现了对ini文件的读取修改删除等操作。
4.可以使用Section或非Section方式。Section就是对每个属性设计一个块。具体可以参看后面的例子。
5.程序注释清晰易懂,你可以任意修改,例子的说明非常详细。
注:这是个测试版本,可能存在BUG,欢迎大家测试寻找错误。有问题可以留言。
下面是例子和程序,最下面有打包下载。
使用例子:
- <?php
- /**
- * PHPIni解析类详细例子
- */
- require_once('PHPIni.class.php');
- //------------基础用法(不带Section)--------------
- $ini = new PHPIni('config1.ini.php', false); //文件必须为PHP结尾.保证安全性 如果文件不存在就创建
- //以非Section方式打开.也就是忽略Section的存在
- $ini->setKey('key1', 'value1'); //设置key
- $ini->setKey('key2', 'value2');
- $ini->saveIniFile(); //设置完要保存ini文件.这步很重要
- print_r($ini->getIniArr()); //打印出解析ini文件得到的数组
- //这时候你可以打开config1.ini.php看下设置是什么样的,然后执行下面的语句
- $ini->setKey('key1', '我是可以key1'); //更改key1的值
- $ini->delKey('key2'); //删除key2
- $ini->saveIniFile(); //保存文件
- print_r($ini->getIniArr()); //打印出解析ini文件得到的数组
- unset($ini);
- //------------end 基础用法(不带Section)--------------
- //------------中级用法(带Section)------------------
- $ini = new PHPIni('config2.ini.php'); //使用默认方式(Section方式)打开文件
- //注:在Section模式下.每个键值都必须依附于一个Section.
- $ini->addSection('section1'); //如果一个Section都没有就必须设置一个
- $ini->setKey('key1', 'value1', 'section1'); //为Section1设置一个值
- $ini->addSection('section2', array('key1' => 'value1')); //直接为Section设置值 和上面的效果相同
- $ini->setKey('key2', 'value2'); //Section为空.就在最后一个Section后增加值.当前就是在Section2后加入
- $ini->saveIniFile(); //保存文件
- print_r($ini->getIniArr()); //打印出解析ini文件得到的数组
- $ini->delSection('section1'); //删除Section 注意下面的所有键值都会被删除
- $ini->saveIniFile(); //保存文件
- print_r($ini->getIniArr()); //打印出解析ini文件得到的数组
- unset($ini);
- //------------end 中级用法(带Section)------------------
- //------------高级用法(通过数组设置ini)------------------
- $ini = new PHPIni('config3.ini.php');
- $iniArr = array(
- 'section1' => array(
- 'key1' => 'value1',
- 'key2' => 'value2',
- ),
- 'section2' => array(
- 'key1' => 'value1',
- 'key2' => 'value2',
- ),
- );
- $ini->setIniArr($iniArr);
- $ini->saveIniFile(); //把数组保存到Ini文件
- //下面的方法也可以
- $ini->setIniFile($iniArr); //这个方法也可以.跟上面两句话等价.
- //------------end 高级用法(通过数组设置ini)------------------
- <?php
- /**
- * PHPIni解析类 Beta - PHP修改删除增加配置文件
- *
- * @author Jessica
- * @link www.skiyo.cn
- * @version 1.0.0
- *
- */
- class PHPIni {
- /**
- * Ini文件的数组形式
- *
- * @var array
- */
- private $iniArr = array();
- /**
- * Ini文件路径
- *
- * @var string
- */
- private $iniFile = '';
- /**
- * 是否以Section方式打开ini文件
- *
- * @var boolean
- */
- private $isSection = true;
- /**
- * 构造函数
- * $iniFile表示文件路径.若不存在就自动创建
- * $isSection表示是否以Section方式打开ini文件
- *
- * @param string $iniFile
- * @param boolean $isSection
- * @access public
- */
- public function __construct($iniFile, $isSection = true) {
- $this->iniFile = $iniFile;
- $this->isSection = $isSection;
- if (emptyempty($this->iniArr)) {
- $this->parseIni();
- }
- }
- /**
- * 解析ini文件到数组
- *
- * @access public
- * @return void
- */
- private function parseIni() {
- if (emptyempty($this->iniFile) || !is_file($this->iniFile)) {
- if (!$this->createIniFile()) {
- $this->throwException('无法创建Ini文件!');
- }
- }
- $this->iniArr = parse_ini_file($this->iniFile, $this->isSection);
- }
- /**
- * 获取解析到的数组
- *
- * @return array
- * @access public
- */
- public function getIniArr() {
- return $this->iniArr;
- }
- /**
- * 创建Ini文件
- *
- * @return boolean
- * @access private
- */
- private function createIniFile() {
- if (touch($this->iniFile)) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 添加或者修改一个config
- * 如果存在就更改以前的设置.如果不存在就添加ini设置
- * 如果$section为空就在最后添加设置,如果不为空就在指定的$section添加设置
- *
- * @param string $key
- * @param mixed $value
- * @param string $section
- * @access public
- * @return void
- */
- public function setKey($key, $value, $section = '') {
- //如果$section为空就在最后添加设置
- if (emptyempty($section)) {
- if ($this->isSection) {
- //将数组指针移动到最后
- end($this->iniArr);
- //在数组的最后插入元素
- if (emptyempty($this->iniArr[key($this->iniArr)])) {
- $this->throwException('没有任何Section,请先添加Section');
- }
- $this->iniArr[key($this->iniArr)][$key] = $value;
- } else {
- $this->iniArr[$key] = $value;
- }
- } else {
- //$section就按照$section添加设置
- if ($this->isSection) {
- $this->iniArr[$section][$key] = $value;
- } else {
- $this->iniArr[$key] = $value;
- }
- }
- }
- /**
- * 增加一个Section,其内容为数组
- *
- * @param string $section
- * @param array $value
- */
- public function addSection($section, $value = array()) {
- if (!$this->isSection) {
- $this->throwException('无法在非Section模式下增加Section!');
- } else {
- if (array_key_exists($section, $this->iniArr)) {
- $this->throwException('无法增加Section,已经存在相同的Section!');
- } else {
- if (is_array($value)) {
- $this->iniArr[$section] = $value;
- } else {
- $this->throwException('Section的值必须是数组!');
- }
- }
- }
- }
- /**
- * 手工设置ini的参数.
- *
- * @param array $iniArr
- * @access public
- */
- public function setIniArr($iniArr) {
- $this->iniArr = $iniArr;
- }
- /**
- * 删除一个Section
- *
- * @param string $section
- */
- public function delSection($section) {
- if ($this->isSection) {
- if (array_key_exists($section, $this->iniArr)) {
- unset($this->iniArr[$section]);
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
- /**
- * 删除一个config
- * 如果$section为空就在最后一个Section删除对应的Key
- *
- * @param string $key
- * @param string $section
- */
- public function delKey($key, $section = '') {
- if (emptyempty($section)) {
- if ($this->isSection) {
- end($this->iniArr);
- if (array_key_exists($key, $this->iniArr[key($this->iniArr)])) {
- unset($this->iniArr[key($this->iniArr)][$key]);
- } else {
- return false;
- }
- } else {
- if (array_key_exists($key, $this->iniArr)) {
- unset($this->iniArr[$key]);
- } else {
- return false;
- }
- }
- } else {
- //$section就按照$section添加设置
- if ($this->isSection) {
- if (array_key_exists($key, $this->iniArr[$section])) {
- unset($this->iniArr[$section][$key]);
- } else {
- return false;
- }
- } else {
- if (array_key_exists($key, $this->iniArr)) {
- unset($this->iniArr[$key]);
- } else {
- return false;
- }
- }
- }
- return true;
- }
- /**
- * 删除数组中相同的元素.(只搜索第一层键值)
- *
- * @param array $array
- * @return array
- * @access private
- */
- private function removeSameArrKey($array) {
- foreach ($array as $key => $value) {
- $keyArr[] = $key;
- }
- $keyArr = array_unique($keyArr);
- foreach ($array as $key1 => $value) {
- foreach ($keyArr as $key2) {
- if ($key2 == $key1) {
- $return[$key2] = $value;
- }
- }
- }
- return $return;
- }
- /**
- * 根据数组保存ini文件
- * 注:如果$iniArr为空默认使用事先读到的数组
- *
- * @param array $iniArr
- * @return boolean
- * @access public
- */
- public function setIniFile($iniArr = array()) {
- if (emptyempty($this->iniFile) || !is_file($this->iniFile)) {
- $this->throwException('没有找到ini文件!');
- } else {
- //判断参数
- if (emptyempty($iniArr)) {
- if (emptyempty($this->iniArr)) {
- $this->throwException('没有任何可以读取的设置!请先解析Ini');
- } else {
- $iniArr = $this->iniArr;
- }
- }
- //生成Ini
- $iniArr = $this->removeSameArrKey($iniArr);
- foreach($iniArr as $key => $item) {
- //由于只会有一层Section.所以不必递归
- //Section
- if(is_array($item)) {
- $item = array_unique($item);
- $content .= "\n[{$key}]\n";
- foreach ($item as $key2 => $item2) {
- if(is_numeric($item2) || is_bool($item2)) {
- $content .= "{$key2} = {$item2}\n";
- } else{
- $content .= "{$key2} = \"{$item2}\"\n";
- }
- }
- } else {
- if(is_numeric($item) || is_bool($item)) {
- $content .= "{$key} = {$item}\n";
- } else {
- $content .= "{$key} = \"{$item}\"\n";
- }
- }
- }
- //保证安全性
- $content = "<?php \n".$content."?>";
- //写入文件
- if(!$handle = fopen($this->iniFile, 'w')) {
- return false;
- }
- if (flock($handle, LOCK_EX)) {
- if(!fwrite($handle, $content)) {
- return false;
- }
- flock($handle, LOCK_UN); // 释放锁定
- fclose($handle);
- return true;
- } else {
- $this->throwException('无法锁定ini文件'.$this->iniFile);
- }
- }
- }
- /**
- * 保存ini文件
- *
- * @return boolean
- * @access public
- */
- public function saveIniFile() {
- if ($this->setIniFile()) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 抛出一异常信息
- *
- * @param string $message
- * @return void
- * @access protected
- */
- protected function throwException($message) {
- throw new Exception($message);
- }
- }
2 Comments to “ PHPIni解析类 Beta – PHP修改删除增加配置文件 ”
Post comment
分类目录
- ActionScript (2)
- CSS (25)
- Java (3)
- JavaScript (41)
- PHP (108)
- 心情杂谈 (34)
- 收集整理 (77)
- 本站原创 (58)
最近文章
- [演讲稿]OAuth1.0协议
- 在sae中利用SaeFetchurl进行豆瓣的OAuth授权
- OAuth 1.0a与1.0协议的改进…
- 深入理解OAuth与豆瓣OAuth test
- include_path+__autoload与数组+__autoload的比较
- 将google ssl设置为IE8的默认搜索引擎..
- 我们来做一个会呼吸的菜单吧!!
- 在编译php-fpm0.6的时候需要注意的一些问题
- 使用PHP将大文件导入到数据库中..
- 关于用PHP调用WebService中参数为complexType的问题
- 神奇的两次按位非运算符
- 百路推免费短网址服务..首创”收藏夹获取短网址”..
- 哥学社正式上线..
- jQuery中getJSON跨域原理详解
- Web辅助工具条(原名:河蟹工具条CrabBar)0.1发布
近期评论
- Gonten 在 在sae中利用SaeFetchurl进行豆瓣的OAuth授权 上的评论
- Amaranth 在 [演讲稿]OAuth1.0协议 上的评论
- 胖子 在 [演讲稿]OAuth1.0协议 上的评论
- 老飞的小窝 在 jQuery中getJSON跨域原理详解 上的评论
- Jackie.Hamos 在 将google ssl设置为IE8的默认搜索引擎.. 上的评论
- Elmer Zhang 在 在sae中利用SaeFetchurl进行豆瓣的OAuth授权 上的评论
- 茶叶蛋 在 一个PHP+AJAX留言板的完整例子.非常简单! 上的评论
- 9527 在 我们为什么要抛弃模板引擎?? 上的评论
- hikurasai 在 Flash TagCloud中文版. 上的评论
- lx 在 PHP上传进度条深度解析 上的评论
文章归档
- 2010 年九月 (1)
- 2010 年八月 (4)
- 2010 年七月 (3)
- 2010 年六月 (4)
- 2010 年五月 (2)
- 2010 年四月 (9)
- 2010 年三月 (12)
- 2010 年二月 (1)
- 2010 年一月 (3)
- 2009 年十二月 (2)
- 2009 年十一月 (3)
- 2009 年十月 (3)
- 2009 年九月 (5)
- 2009 年八月 (4)
- 2009 年七月 (6)
- 2009 年六月 (8)
- 2009 年五月 (8)
- 2009 年四月 (16)
- 2009 年三月 (19)
- 2009 年二月 (22)
- 2009 年一月 (20)
- 2008 年十二月 (38)
- 2008 年十一月 (22)
- 2008 年十月 (7)
- 2008 年九月 (3)
- 2008 年八月 (24)
标签
.net
AJAX
button
Comet
CSS
Discuz!
DIV+CSS
Flash
Form
Google
HTML编辑器
IE8
Java
JavaScript
jQuery
JSP
md5
MySQLReback
OAuth
Oracle
PHP
php-fpm
PNG
Punny
SkiyoTabs
tab
TagCloud
Vista
Web2.0
Windows7
上传
加密
图标
本站原创
模板
模板引擎
源码
登录
短网址
石家庄
算法
类
编译
面向对象
魔术方法

Jessica

不错,有空也来看看我的,交流交流 http://loving.zhan.cn.yahoo.com/
路过,希望能向你学习!