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

这篇文章主要介绍了一个非常完美的读写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으로 문의하세요.
如何使用 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库。首先需要在项目

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

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

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

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

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.