一个非常完美的读写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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP を使用してデータ キャッシュと読み書き機能を実装する方法。キャッシュはシステム パフォーマンスを向上させる重要な方法です。キャッシュを通じて、頻繁に使用されるデータをメモリに保存し、データの読み取り速度を向上させることができます。 PHP では、さまざまな方法を使用して、データのキャッシュ機能や読み書き機能を実装できます。この記事では、ファイル キャッシュの使用とメモリ キャッシュの使用という 2 つの一般的な方法を紹介します。 1. ファイル キャッシュを使用する ファイル キャッシュでは、後で読み取るためにデータをファイルに保存します。以下は、ファイル キャッシュを使用してデータの読み取りと書き込みを行うサンプル コードです。

Concept fio は FlexibleIOTester としても知られ、JensAxboe によって作成されたアプリケーションです。 Jens は LinuxKernel の blockIOsubsystem のメンテナです。 FIO は、ネットワーク ファイル システムとディスクのパフォーマンスをテストするために使用されるツールで、マシン モデルの検証やファイル システムのパフォーマンスの比較によく使用されます。 fio コマンドをクラスター マシンのリストに自動的に送信し、小さなファイルの IOPS と大きなファイルのスループット データを収集します。 rw=[mode]rwmixwrite=30 読み取りと書き込みの混合モードでは、書き込みが 30% を占めます。 moderead シーケンシャル読み取り write シーケンシャル書き込み readwrite シーケンシャル読み取りと書き込みの混合 randwrite ランダム書き込み r

ファイル システム API Java ファイル操作の内部原理は、オペレーティング システムのファイル システム API と密接に関連しています。 Java では、ファイル操作は java.NIO パッケージの java.nio.file モジュールによって提供されます。このモジュールはファイル システム API のカプセル化を提供し、Java 開発者が統合 API を使用してさまざまなオペレーティング システム上でファイル操作を実行できるようにします。ファイル オブジェクト Java プログラムがファイルにアクセスする必要がある場合、まず java.nio.file.Path オブジェクトを作成する必要があります。 Path オブジェクトはファイル システム内のパスを表し、絶対パスまたは相対パスを使用できます。 Path オブジェクトが作成されたら、それを使用してファイルの名前などのさまざまなプロパティを取得できます。

Java で DBF ファイルを処理する読み取りおよび書き込みメソッドの復号化 DBF (dBaseFile) は、通常、表形式のデータを格納するために使用される一般的なデータベース ファイル形式です。 Java プログラムでは、DBF ファイルの読み取りと書き込みの処理は比較的一般的な要件です。この記事では、Java を使用してこのプロセスを復号化する方法を紹介し、具体的なコード例を示します。 1. DBF ファイルの読み取り Java で DBF ファイルを読み取るには、通常、dbfread ライブラリなどのサードパーティ ライブラリを使用する必要があります。まず、プロジェクトを構成する必要があります

Java 開発では、同時読み取りおよび書き込みデータの一貫性の問題に対処することが非常に重要です。マルチスレッドおよび分散システムの普及に伴い、データの同時読み取りと書き込みがますます一般的になり、慎重に扱わないとデータの不整合が生じる可能性があります。この記事では、同時読み取りおよび書き込みデータの整合性の問題に対処するための一般的な方法をいくつか紹介します。 1. ロック メカニズムを使用する 同時読み取りおよび書き込みデータの一貫性の問題に対処するために最も一般的に使用される方法の 1 つは、ロック メカニズム (synchronized キーワードや ReentrantLock クラスなど) を使用することです。合格

インターネットの普及に伴い、Web アプリケーションはビジネス マーケティングとソーシャル コミュニケーションにとって重要なツールになりました。 Web アプリケーションの高速な読み取りと書き込みは、Web アプリケーション設計の基本的な問題です。 Golang は効率的で簡潔なプログラミング言語として、プログラマーが高速な読み取りと書き込みのニーズを達成するのに役立ちます。この記事では、Golang を使用して Web アプリケーションの高速な読み取りと書き込みを実現する方法を学びます。 1. データベース接続を確立する Golang を使用して Web アプリケーションの高速な読み取りと書き込みを実装する前に、データベース接続を確立する必要があります。

一般的に使用されるテーブル ファイル形式として、Excel ファイルは開発プロセスでよく使用されます。一般的に使用されるプログラミング言語として、PHP は Excel ファイルの読み取りおよび書き込み操作もサポートしています。この記事では、PHPを使ってExcelファイルを読み書きする方法を紹介します。 PHPExcel ライブラリをインストールする PHPExcel は、Excel ファイルを簡単に読み書きできるオープンソースの PHP ライブラリです。 Composer を通じてインストールすることも、GitHub から直接ダウンロードすることもできます

PHP ファイルの読み取りと書き込みのチュートリアル: 読み取りと書き込みの基本的な方法とプロセスの詳細な紹介: Web アプリケーションを開発する場合、ファイルの読み取りと書き込みの操作は非常に基本的で一般的な操作です。 PHP は、ファイルの読み取りおよび書き込み操作を実装するための一連のメソッドと関数を提供しており、非常にシンプルで使いやすいです。このチュートリアルでは、PHP でファイルを読み書きする基本的な方法とプロセスを詳細に紹介し、コード例を示します。 1. ファイルの読み取りとオープン ファイルの読み取りを開始する前に、まずファイルを開く必要があります。 fopen() 関数を通じて開くことができます
