一個非常完美的讀寫ini格式的PHP配置類分享,讀寫ini格式php_PHP教程

來源:互聯網
上載者:User

一個非常完美的讀寫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 < substr_count ( $k, ':' )) {   throw new ErrorException ( 'config ' . $k . ' is invalid, ':' can appear only once' );  } else {   $keys = explode ( ':', $k );   if (! isset ( $confObj->$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=rootdb.default.password=123456admin.username=adminadmin.password=123456php.error_reporting=E_ALLphp.display_errors=nophp.log_errors=yesphp.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=rootdb.test1.password=123456php.display_errors=yes

http://www.bkjia.com/PHPjc/957124.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/957124.htmlTechArticle一個非常完美的讀寫ini格式的PHP配置類分享,讀寫ini格式php 基本滿足所有配置相關的需求。 /** * 解析.ini格式的設定檔為一個樹形結構的...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.