首页 php教程 php手册 一个非常完美的读写ini格式的PHP配置类分享

一个非常完美的读写ini格式的PHP配置类分享

Jun 06, 2016 pm 08:10 PM
读写

这篇文章主要介绍了一个非常完美的读写ini格式的PHP配置类分享,本文给出类代码、使用例子和配置文件例子,需要的朋友可以参考下

基本满足所有配置相关的需求。

/** * 解析.ini格式的配置文件为一个树形结构的对象 * 配置文件不同section通过冒号继承 * 默认根据hostname确定使用的section,如果不能确定就优先使用production * 检测环境的时候总是优先检测production,其余section按定义顺序检测 * * @author ares@phpdr.net * */ class Config { /** * 解析后的配置文件 * * @var stdClass */ private $config; /** * 一个二维数组,键是配置文件的section * 值是一个数组或回调函数 * 如果是数组则计算hostname是否在数组中决定是否使用该section * 如果是回调函数通过返回值true或false来确定是否使用该section * * @var array */ private $map = array (); /** * section会被解析,:表示继承 * 配置项中的'.'用来区分层级关系 * section中的'.'不会被解析,配置中的数组不受影响。 * * @param string $conf * @throws ErrorException * @return stdClass */ function __construct($conf, $map) { $config = $this->parseIni ( ( object ) parse_ini_string ( $conf, true ) ); if (array_key_exists ( 'production', $map )) { $production = $map ['production']; unset ( $map ['production'] ); $map = array_merge ( array ( 'production' => $production ), $map ); } else { throw new ErrorException ( 'production section not found in config' ); } $section = 'production'; $hostname = gethostname (); foreach ( $map as $k => $v ) { if (is_array ( $v )) { foreach ( $v as $v1 ) { if ($v1 == $hostname) { $section = $k; break 2; } } } elseif (is_callable ( $v )) { if (true == call_user_func ( $v )) { $section = $k; break; } } else { throw new ErrorException ( 'Wrong map value in ' . __CLASS__ ); } } $this->config = $config->$section; } /** * 总是返回配置对象 * * @return mixed */ function __get($key) { if (isset ( $this->config->$key )) { return $this->config->$key; } } /** * 切分 * * @param stdClass $v * @param string $k1 * @param mixed $v1 */ private function split($v, $k1, $v1) { $keys = explode ( '.', $k1 ); $last = array_pop ( $keys ); $node = $v; foreach ( $keys as $v2 ) { if (! isset ( $node->$v2 )) { $node->$v2 = new stdClass (); } $node = $node->$v2; } $node->$last = $v1; if (count ( $keys ) > 0) { unset ( $v->$k1 ); } } /** * parseIni * * @param object $conf * @return stdClass */ private function parseIni($conf) { $confObj = new stdClass (); foreach ( $conf as $k => $v ) { // 是section if (is_array ( $v )) { $confObj->$k = ( object ) $v; foreach ( $v as $k1 => $v1 ) { call_user_func ( array ( $this, 'split' ), $confObj->$k, $k1, $v1 ); } } else { call_user_func ( array ( $this, 'split' ), $confObj, $k, $v ); } } unset ( $conf ); // 处理继承 foreach ( $confObj as $k => $v ) { if (false !== strpos ( $k, ':' )) { if (0 === strpos ( $k, ':' )) { throw new ErrorException ( 'config ' . $k . ' is invalid, ':' can't be the first char' ); } elseif (1 $keys [1] )) { throw new ErrorException ( 'parent section ' . $keys [1] . ' doesn't exist in config file' ); } else { if (isset ( $confObj->$keys [0] )) { throw new ErrorException ( 'config is invalid, ' . $keys [0] . ' and ' . $k . ' conflicts' ); } else { $confObj->$keys [0] = $this->deepCloneR ( $confObj->$keys [1] ); $this->objectMergeR ( $confObj->$keys [0], $v ); unset ( $confObj->$k ); } } } } } return $confObj; } /** * php默认是浅克隆,,函数实现深克隆 * * @param object $obj * @return object $obj */ private function deepCloneR($obj) { $objClone = clone $obj; foreach ( $objClone as $k => $v ) { if (is_object ( $v )) { $objClone->$k = $this->deepCloneR ( $v ); } } return $objClone; } /** * 递归的合并两个对象 * * @param unknown $obj1 * @param unknown $obj2 */ private function objectMergeR($obj1, $obj2) { foreach ( $obj2 as $k => $v ) { if (is_object ( $v ) && isset ( $obj1->$k ) && is_object ( $obj1->$k )) { $this->objectMergeR ( $obj1->$k, $v ); } else { $obj1->$k = $v; } } } }

简单使用:

$_ENV ['config'] = new Config ( file_get_contents ( __DIR__ . '/config.ini' ), array ( 'development' => array ( 'localhost.localdomain', 'localhost' ), 'production' => array () ) );

配置文件示例:

[product] db.default.dsn="mysql:host=127.0.0.1;dbname=default" db.default.username=root db.default.password=123456 admin.username=admin admin.password=123456 php.error_reporting=E_ALL php.display_errors=no php.log_errors=yes php.error_log=APP_PATH'/resource/log/phpError.log' php.session.save_path=APP_PATH'/resource/data/session' [development:product] db.test1.dsn="mysql:host=127.0.0.1;dbname=test1" db.test1.username=root db.test1.password=123456 php.display_errors=yes

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用 PHP 实现数据缓存和读写功能 如何使用 PHP 实现数据缓存和读写功能 Sep 05, 2023 pm 05:45 PM

如何使用PHP实现数据缓存和读写功能缓存是提高系统性能的一种重要方式,通过缓存可以将频繁使用的数据存储在内存中,以提高数据的读取速度。在PHP中,我们可以使用各种方法来实现数据缓存和读写功能。本文将介绍两种常用的方法:使用文件缓存和使用内存缓存。一、使用文件缓存文件缓存是将数据存储在文件中,以便后续读取。下面是一个使用文件缓存实现数据读写的示例代码:

实战:Linux上硬盘io读写测试 实战:Linux上硬盘io读写测试 Feb 19, 2024 pm 03:40 PM

概念fio,又称为FlexibleIOTester,是JensAxboe编写的应用程序。Jens是LinuxKernel中blockIOsubsystem的维护者。FIO是一种用于测试网络文件系统和磁盘性能的工具,常用于验证机型和比较文件系统性能。它能自动将fio命令发送到集群机器列表,并收集小文件的IOPS和大文件的吞吐量数据。rw=[mode]rwmixwrite=30在混合读写的模式下,写占30%moderead顺序读write顺序写readwrite顺序混合读写randwrite随机写r

揭秘 Java 文件操作的内部原理 揭秘 Java 文件操作的内部原理 Feb 28, 2024 am 08:22 AM

文件系统APIJava文件操作的内部原理与操作系统的文件系统api密切相关。在Java中,文件操作是由java.NIO包中的java.nio.file模块提供的。该模块提供了对文件系统API的封装,使Java开发者能够在不同的操作系统上使用统一的API进行文件操作。文件对象当Java程序需要访问文件时,它首先需要创建一个java.nio.file.Path对象。Path对象代表了文件系统中的一个路径,可以是绝对路径也可以是相对路径。一旦创建了Path对象,就可以使用它来获取文件的各种属性,如名称

解密Java中处理DBF文件的读取和写入方法 解密Java中处理DBF文件的读取和写入方法 Mar 29, 2024 pm 12:39 PM

解密Java中处理DBF文件的读取和写入方法DBF(dBASEFile)是一种常见的数据库文件格式,通常用于存储表格数据。在Java程序中,处理DBF文件的读取和写入是一个比较常见的需求。本文将介绍如何使用Java解密这一过程,并提供具体的代码示例。一、读取DBF文件在Java中,读取DBF文件通常需要借助第三方库,比如使用dbfread库。首先需要在项目

如何使用Golang实现Web应用程序的快速读写 如何使用Golang实现Web应用程序的快速读写 Jun 24, 2023 pm 03:24 PM

随着互联网的普及,Web应用程序已经成为了商业营销和社交交流的重要工具。Web应用程序的快速读写是Web应用程序设计中的一个基本问题。Golang作为一种高效且简洁的编程语言,可以帮助程序员实现快速读写的需求。在本文中,我们将学习如何使用Golang实现Web应用程序的快速读写。一、建立数据库连接在使用Golang实现Web应用程序的快速读写前,我们要建立

Java开发中如何处理并发读写数据一致性问题 Java开发中如何处理并发读写数据一致性问题 Jun 29, 2023 am 08:10 AM

在Java开发中,处理并发读写数据一致性问题是非常重要的。随着多线程和分布式系统的流行,同时读写数据的情况越来越普遍,而且如果不谨慎处理,可能会导致数据的不一致性。本文将介绍几种常见的处理并发读写数据一致性问题的方法。一、使用锁机制最常用的处理并发读写数据一致性问题的方法之一就是使用锁机制(如synchronized关键字或ReentrantLock类)。通

PHP实现Excel文件的读写操作 PHP实现Excel文件的读写操作 Jun 18, 2023 am 10:03 AM

Excel文件作为一种常用的表格文件格式,经常在开发过程中被使用。PHP作为一种常用的编程语言,也支持对Excel文件的读写操作。在本文中,我们将介绍如何使用PHP实现Excel文件的读写操作。安装PHPExcel库PHPExcel是一个开源的PHP库,可以方便地对Excel文件进行读写操作。它可以通过Composer进行安装,也可以直接从GitHub上下载

PHP文件读写教程:详细介绍读取和写入的基本方法和流程 PHP文件读写教程:详细介绍读取和写入的基本方法和流程 Sep 06, 2023 pm 12:12 PM

PHP文件读写教程:详细介绍读取和写入的基本方法和流程引言:在开发Web应用程序时,文件的读取和写入操作是非常基础且常见的操作。PHP提供了一系列的方法和函数来实现文件读写操作,并且非常简单易用。本教程将详细介绍PHP中文件的读取和写入的基本方法和流程,并给出代码示例。一、文件的读取打开文件在开始读取文件前,首先需要打开文件。可以通过fopen()函数来打开

See all articles