Maison 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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser PHP pour implémenter des fonctions de mise en cache, de lecture et d'écriture de données Comment utiliser PHP pour implémenter des fonctions de mise en cache, de lecture et d'écriture de données Sep 05, 2023 pm 05:45 PM

Comment utiliser PHP pour implémenter des fonctions de mise en cache de données et de lecture-écriture. Grâce à la mise en cache, les données fréquemment utilisées peuvent être stockées en mémoire pour augmenter la vitesse de lecture des données. En PHP, nous pouvons utiliser diverses méthodes pour implémenter des fonctions de mise en cache et de lecture et d’écriture des données. Cet article présentera deux méthodes courantes : l'utilisation de la mise en cache de fichiers et l'utilisation de la mise en cache de mémoire. 1. Utilisez la mise en cache de fichiers. La mise en cache de fichiers stocke les données dans des fichiers pour une lecture ultérieure. Voici un exemple de code qui utilise la mise en cache de fichiers pour lire et écrire des données :

Combat pratique : test de lecture et d'écriture du disque dur sous Linux Combat pratique : test de lecture et d'écriture du disque dur sous Linux Feb 19, 2024 pm 03:40 PM

Concept fio, également connu sous le nom de FlexibleIOTester, est une application écrite par JensAxboe. Jens est le responsable du sous-système blockIO dans LinuxKernel. FIO est un outil utilisé pour tester les performances du système de fichiers réseau et des disques. Il est souvent utilisé pour vérifier les modèles de machines et comparer les performances du système de fichiers. Il envoie automatiquement des commandes fio à une liste de machines du cluster et collecte les IOPS pour les petits fichiers et les données de débit pour les gros fichiers. rw=[mode]rwmixwrite=30 En mode lecture et écriture mixte, l'écriture représente 30 % moderead lecture séquentielle écriture écriture séquentielle lectureécriture séquentielle lecture et écriture mixte randwrite écriture aléatoire r

Révéler le fonctionnement interne des opérations sur les fichiers Java Révéler le fonctionnement interne des opérations sur les fichiers Java Feb 28, 2024 am 08:22 AM

API du système de fichiersLes principes internes des opérations sur les fichiers Java sont étroitement liés à l'API du système de fichiers du système d'exploitation. En Java, les opérations sur les fichiers sont fournies par le module java.nio.file du package java.NIO. Ce module fournit une encapsulation de l'API du système de fichiers, permettant aux développeurs Java d'utiliser une API unifiée pour effectuer des opérations sur les fichiers sur différents systèmes d'exploitation. Objet fichier Lorsqu'un programme Java doit accéder à un fichier, il doit d'abord créer un objet java.nio.file.Path. L'objet Path représente un chemin dans le système de fichiers, qui peut être un chemin absolu ou un chemin relatif. Une fois l'objet Path créé, vous pouvez l'utiliser pour obtenir diverses propriétés du fichier, telles que le nom

Décrypter les méthodes de lecture et d'écriture de traitement des fichiers DBF en Java Décrypter les méthodes de lecture et d'écriture de traitement des fichiers DBF en Java Mar 29, 2024 pm 12:39 PM

Décryptage des méthodes de lecture et d'écriture de traitement des fichiers DBF en Java DBF (dBaseFile) est un format de fichier de base de données courant qui est généralement utilisé pour stocker des données tabulaires. Dans les programmes Java, le traitement de la lecture et de l'écriture des fichiers DBF est une exigence relativement courante. Cet article explique comment utiliser Java pour décrypter ce processus et fournit des exemples de code spécifiques. 1. Lecture des fichiers DBF En Java, la lecture des fichiers DBF nécessite généralement l'aide d'une bibliothèque tierce, telle que la bibliothèque dbfread. Tout d'abord, vous devez configurer le projet

Comment gérer les problèmes de cohérence des données de lecture et d'écriture simultanées dans le développement Java Comment gérer les problèmes de cohérence des données de lecture et d'écriture simultanées dans le développement Java Jun 29, 2023 am 08:10 AM

Dans le développement Java, il est très important de traiter le problème de la cohérence des données en lecture et en écriture simultanées. Avec la popularité des systèmes multithread et distribués, la lecture et l'écriture simultanées de données deviennent de plus en plus courantes et, si elles ne sont pas traitées avec soin, elles peuvent entraîner une incohérence des données. Cet article présentera plusieurs méthodes courantes pour résoudre les problèmes de cohérence des données en lecture et en écriture simultanées. 1. Utiliser un mécanisme de verrouillage L'une des méthodes les plus couramment utilisées pour résoudre les problèmes de cohérence des données en lecture et écriture simultanées consiste à utiliser un mécanisme de verrouillage (tel que le mot clé synchronisé ou la classe ReentrantLock). Passer

PHP implémente des opérations de lecture et d'écriture de fichiers Excel PHP implémente des opérations de lecture et d'écriture de fichiers Excel Jun 18, 2023 am 10:03 AM

En tant que format de fichier de tableau couramment utilisé, les fichiers Excel sont souvent utilisés dans le processus de développement. En tant que langage de programmation couramment utilisé, PHP prend également en charge les opérations de lecture et d'écriture sur les fichiers Excel. Dans cet article, nous présenterons comment utiliser PHP pour lire et écrire des fichiers Excel. Installez la bibliothèque PHPExcel PHPExcel est une bibliothèque PHP open source qui peut facilement lire et écrire des fichiers Excel. Il peut être installé via Composer ou téléchargé directement depuis GitHub

Tutoriel de lecture et d'écriture de fichiers PHP : introduction détaillée aux méthodes et processus de base de lecture et d'écriture Tutoriel de lecture et d'écriture de fichiers PHP : introduction détaillée aux méthodes et processus de base de lecture et d'écriture Sep 06, 2023 pm 12:12 PM

Tutoriel de lecture et d'écriture de fichiers PHP : Introduction détaillée aux méthodes et processus de base de lecture et d'écriture Introduction : Lors du développement d'applications Web, les opérations de lecture et d'écriture de fichiers sont des opérations très basiques et courantes. PHP fournit une série de méthodes et de fonctions pour implémenter des opérations de lecture et d'écriture de fichiers, et est très simple et facile à utiliser. Ce tutoriel présentera en détail les méthodes et processus de base de lecture et d'écriture de fichiers en PHP, et donnera des exemples de code. 1. Lecture et ouverture de fichiers Avant de commencer à lire des fichiers, vous devez d'abord ouvrir les fichiers. Peut être ouvert via la fonction fopen()

Comment utiliser Golang pour obtenir une lecture et une écriture rapides d'applications Web Comment utiliser Golang pour obtenir une lecture et une écriture rapides d'applications Web Jun 24, 2023 pm 03:24 PM

Avec la popularité d’Internet, les applications Web sont devenues un outil important pour le marketing commercial et la communication sociale. La lecture et l'écriture rapides d'applications Web sont un problème fondamental dans la conception d'applications Web. En tant que langage de programmation efficace et concis, Golang peut aider les programmeurs à répondre à leurs besoins de lecture et d'écriture rapides. Dans cet article, nous apprendrons comment utiliser Golang pour obtenir une lecture et une écriture rapides d'applications Web. 1. Établissez une connexion à la base de données. Avant d'utiliser Golang pour implémenter une lecture et une écriture rapides d'applications Web, nous devons établir

See all articles