ini文件编辑

  • 内容
  • 评论
  • 相关
<?php

define('CONFIG_PARSER_LF', "\n"); //如果为windows,请设置为\r\n

class ConfigParser
{
    private static $_instance = null;
    private $_config;
    private $_filePath;

    final private function __construct() {}

    final private function __clone() {}

    public static function instance($filePath)
    {
        if (empty(self::$_instance)) {
            self::$_instance = new ConfigParser();
        }

        self::$_instance->_filePath = $filePath;
        self::$_instance->_config = @parse_ini_file($filePath, true);
        if (empty(self::$_instance->_config)) {
            self::$_instance->_config = array();
        }

        return self::$_instance;
    }

    public function get()
    {
        //获取所有
        if (func_num_args() == 0) {
            return $this->_config;
        }

        //获取section
        if (func_num_args() == 1) {
            if (!isset($this->_config[func_get_arg(0)])) {
                return null;
            }
            return $this->_config[func_get_arg(0)];
        }

        //获取option
        if (func_num_args() == 2) {
            if (!isset($this->_config[func_get_arg(0)])) {
                return null;
            }

            $selection = $this->_config[func_get_arg(0)];
            if (!is_array($selection) || !isset($selection[func_get_arg(1)])) {
                return null;
            }

            return $selection[func_get_arg(1)];
        }
    }

    public function addSection($section)
    {
        if (isset($this->_config[$section])) {
            return false;
        }

        $this->_config[$section] = array();
        return true;
    }

    public function set()
    {
        if (in_array(func_num_args(), array(2, 3))) {
            return false;
        }

        //设置section
        if (func_num_args() == 2) {
            $this->_config[func_get_arg(0)] = func_get_arg(1);
            return true;
        }

        //设置option
        if (func_num_args() == 3) {
            if (!isset($this->_config[func_get_arg(0)])) {
                $this->_config[func_get_arg(0)] = array();
            }

            if (!is_array($this->_config[func_get_arg(0)])) {
                return false;
            }

            $this->_config[func_get_arg(0)][func_get_arg(1)] = func_get_arg(2);
            return true;
        }
    }

    public function del()
    {
        //删除所有
        if (func_num_args() == 0) {
            $this->_config = array();
            return true;
        }

        //删除section
        if (func_num_args() == 1) {
            if (isset($this->_config[func_get_arg(0)])) {
                unset($this->_config[func_get_arg(0)]);
                return true;
            }
        }

        //删除option
        if (func_num_args() == 2) {
            if (!isset($this->_config[func_get_arg(0)])
                || !is_array($this->_config[func_get_arg(0)])
            ) {
                return false;
            }

            if (!isset($this->_config[func_get_arg(0)][func_get_arg(1)])) {
                return false;
            }

            unset($this->_config[func_get_arg(0)][func_get_arg(1)]);
            return true;
        }

        return false;
    }

    public function write()
    {
        if (empty($this->_fileName)) {
            $this->_config = array();
            return false;
        }

        $contents = array();
        $contentsNotInSection = array();
        if (!empty($this->_config)) {
            foreach ($this->_config as $section => $sectionItem) {
                 if (is_array($sectionItem)) {
                     array_push($contents, "[{$section}]");
                     if (!empty($sectionItem)) {
                         foreach ($sectionItem as $key => $value) {
                             array_push($contents, "{$key} = {$value}");
                         }
                     }
                     continue;
                 }
                 array_push(
                    $contentsNotInSection, "{$section} = {$sectionItem}"
                 );
            }
            $contents = array_unique($contents);
            $contentsNotInSection = array_unique($contentsNotInSection);
            $contents = array_merge($contentsNotInSection, $contents);
        }

        return file_put_contents(
            $this->_filePath, implode(CONFIG_PARSER_LF, $contents)
        );
    }
}


//使用说明
//config.ini
//gmail = hzlhu.dargon@gmail.com
//[section]
//name = value

$config = ConfigParser::instance('config.ini');
//读取
$config->get();
$config->get('gmail');
$config->get('section', 'name');

//添加section
$config->addSection('test');

//设置
$config->set('gmail', 'hzlhu.dargon@gmail.com');
$config->set('section', array('name' => 'value'));
$config->set('section', 'name', 'value');

//删除
$config->del();
$config->del('gmail');
$config->del('section');
$config->del('section', 'name');

//将修改后的值保存到文件中
$config->write();