亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

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

2024-05-04 23:31:17
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了一個非常完美的讀寫ini格式的PHP配置類分享,本文給出類代碼、使用例子和配置文件例子,需要的朋友可以參考下

基本滿足所有配置相關的需求。

 

 
  1. /** 
  2. * 解析.ini格式的配置文件為一個樹形結構的對象 
  3. * 配置文件不同section通過冒號繼承 
  4. * 默認根據hostname確定使用的section,如果不能確定就優先使用production 
  5. * 檢測環境的時候總是優先檢測production,其余section按定義順序檢測 
  6. * 
  7. * @author ares@phpdr.net 
  8.  
  9. */ 
  10. class Config { 
  11. /** 
  12. * 解析后的配置文件 
  13. * 
  14. * @var stdClass 
  15. */ 
  16. private $config
  17. /** 
  18. * 一個二維數組,鍵是配置文件的section 
  19. * 值是一個數組或回調函數 
  20. * 如果是數組則計算hostname是否在數組中決定是否使用該section 
  21. * 如果是回調函數通過返回值true或false來確定是否使用該section 
  22. * 
  23. * @var array 
  24. */ 
  25. private $map = array (); 
  26.  
  27. /** 
  28. * section會被解析,:表示繼承 
  29. * 配置項中的'.'用來區分層級關系 
  30. * section中的'.'不會被解析,配置中的數組不受影響。 
  31. * 
  32. * @param string $conf  
  33. * @throws ErrorException 
  34. * @return stdClass 
  35. */ 
  36. function __construct($conf$map) { 
  37. $config = $this->parseIni ( ( object ) parse_ini_string ( $conf, true ) ); 
  38. if (array_key_exists ( 'production'$map )) { 
  39. $production = $map ['production']; 
  40. unset ( $map ['production'] ); 
  41. $map = array_merge ( array ( 
  42. 'production' => $production ), $map ); 
  43. else { 
  44. throw new ErrorException ( 'production section not found in config' ); 
  45. $section = 'production'
  46. $hostname = gethostname (); 
  47. foreach ( $map as $k => $v ) { 
  48. if (is_array ( $v )) { 
  49. foreach ( $v as $v1 ) { 
  50. if ($v1 == $hostname) { 
  51. $section = $k
  52. break 2; 
  53. elseif (is_callable ( $v )) { 
  54. if (true == call_user_func ( $v )) { 
  55. $section = $k
  56. break
  57. else { 
  58. throw new ErrorException ( 'Wrong map value in ' . __CLASS__ ); 
  59. $this->config = $config->$section
  60.  
  61. /** 
  62. * 總是返回配置對象 
  63. * 
  64. * @return mixed 
  65. */ 
  66. function __get($key) { 
  67. if (isset ( $this->config->$key )) { 
  68. return $this->config->$key
  69.  
  70. /** 
  71. * 切分 
  72. * 
  73. * @param stdClass $v  
  74. * @param string $k1  
  75. * @param mixed $v1  
  76. */ 
  77. private function split($v$k1$v1) { 
  78. $keys = explode ( '.'$k1 ); 
  79. $last = array_pop ( $keys ); 
  80. $node = $v
  81. foreach ( $keys as $v2 ) { 
  82. if (! isset ( $node->$v2 )) { 
  83. $node->$v2 = new stdClass (); 
  84. $node = $node->$v2
  85. $node->$last = $v1
  86. if (count ( $keys ) > 0) { 
  87. unset ( $v->$k1 ); 
  88.  
  89. /** 
  90. * parseIni 
  91. * 
  92. * @param object $conf  
  93. * @return stdClass 
  94. */ 
  95. private function parseIni($conf) { 
  96. $confObj = new stdClass (); 
  97. foreach ( $conf as $k => $v ) { 
  98. // 是section 
  99. if (is_array ( $v )) { 
  100. $confObj->$k = ( object ) $v
  101. foreach ( $v as $k1 => $v1 ) { 
  102. call_user_func ( array ( 
  103. $this
  104. 'split' ), $confObj->$k$k1$v1 ); 
  105. else { 
  106. call_user_func ( array ( 
  107. $this
  108. 'split' ), $confObj$k$v ); 
  109. unset ( $conf ); 
  110. // 處理繼承 
  111. foreach ( $confObj as $k => $v ) { 
  112. if (false !== strpos ( $k':' )) { 
  113. if (0 === strpos ( $k':' )) { 
  114. throw new ErrorException ( 'config ' . $k . ' is invalid, ':' can't be the first char' ); 
  115. elseif (1 < substr_count ( $k':' )) { 
  116. throw new ErrorException ( 'config ' . $k . ' is invalid, ':' can appear only once' ); 
  117. else { 
  118. $keys = explode ( ':'$k ); 
  119. if (! isset ( $confObj->$keys [1] )) { 
  120. throw new ErrorException ( 'parent section ' . $keys [1] . ' doesn't exist in config file' ); 
  121. else { 
  122. if (isset ( $confObj->$keys [0] )) { 
  123. throw new ErrorException ( 'config is invalid, ' . $keys [0] . ' and ' . $k . ' conflicts' ); 
  124. else { 
  125. $confObj->$keys [0] = $this->deepCloneR ( $confObj->$keys [1] ); 
  126. $this->objectMergeR ( $confObj->$keys [0], $v ); 
  127. unset ( $confObj->$k ); 
  128. return $confObj
  129.  
  130. /** 
  131. * php默認是淺克隆,函數實現深克隆 
  132. * 
  133. * @param object $obj  
  134. * @return object $obj 
  135. */ 
  136. private function deepCloneR($obj) { 
  137. $objClone = clone $obj
  138. foreach ( $objClone as $k => $v ) { 
  139. if (is_object ( $v )) { 
  140. $objClone->$k = $this->deepCloneR ( $v ); 
  141. return $objClone
  142.  
  143. /** 
  144. * 遞歸的合并兩個對象 
  145. * 
  146. * @param unknown $obj1  
  147. * @param unknown $obj2  
  148. */ 
  149. private function objectMergeR($obj1$obj2) { 
  150. foreach ( $obj2 as $k => $v ) { 
  151. if (is_object ( $v ) && isset ( $obj1->$k ) && is_object ( $obj1->$k )) { 
  152. $this->objectMergeR ( $obj1->$k$v ); 
  153. else { 
  154. $obj1->$k = $v

簡單使用:

 

 
  1. $_ENV ['config'] = new Config ( file_get_contents ( __DIR__ . '/config.ini' ), array ( 
  2. 'development' => array ( 
  3. 'localhost.localdomain'
  4. 'localhost' 
  5. ), 
  6. 'production' => array () 
  7. ) ); 

配置文件示例:

 

 
  1. [product] 
  2. db.default.dsn="mysql:host=127.0.0.1;dbname=default" 
  3. db.default.username=root 
  4. db.default.password=123456 
  5.  
  6. admin.username=admin 
  7. admin.password=123456 
  8.  
  9. php.error_reporting=E_ALL 
  10. php.display_errors=no 
  11. php.log_errors=yes 
  12. php.error_log=APP_PATH'/resource/log/phpError.log' 
  13. php.session.save_path=APP_PATH'/resource/data/session' 
  14.  
  15. [development:product] 
  16. db.test1.dsn="mysql:host=127.0.0.1;dbname=test1" 
  17. db.test1.username=root 
  18. db.test1.password=123456 
  19. php.display_errors=yes 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久香蕉频线观| 超薄丝袜一区二区| 97精品一区二区三区| 日韩精品免费在线播放| 97精品国产97久久久久久| 久久久久久国产精品美女| 黑人欧美xxxx| 国产精品视频一区二区高潮| 91精品久久久久久综合乱菊| 日本精品一区二区三区在线播放视频| 日韩精品免费在线观看| 欧美精品电影免费在线观看| 91精品国产综合久久久久久久久| 国产欧美日韩精品丝袜高跟鞋| 69久久夜色精品国产69乱青草| 亚洲视频第一页| 亚洲最大福利视频| 最近2019中文字幕一页二页| 国产精品男女猛烈高潮激情| 午夜精品久久久久久久久久久久| 亚洲国产天堂网精品网站| 亚洲成人av在线| 久久久久久久久久久久久久久久久久av| 欧美一级高清免费播放| 精品日韩中文字幕| 亚洲va欧美va在线观看| 高清一区二区三区日本久| 国产亚洲精品久久久| 欧美理论电影在线播放| 91免费看视频.| 久久久这里只有精品视频| 日韩精品有码在线观看| 国产97在线|亚洲| 久久亚洲精品中文字幕冲田杏梨| 久久网福利资源网站| 欧美贵妇videos办公室| 这里只有精品视频在线| 亚洲免费成人av电影| 国产精品视频一| 国产精品国产亚洲伊人久久| 九九精品在线视频| 日韩黄色高清视频| 亚洲**2019国产| 国产精品日韩专区| 中文字幕精品一区二区精品| 欧美成人免费观看| 亚洲一区二区三区四区在线播放| 日韩影视在线观看| 国内精品久久久久影院 日本资源| 亚洲国产高潮在线观看| 91亚洲va在线va天堂va国| 欧美激情视频在线| 欧亚精品在线观看| 一区二区三区国产在线观看| 国产精品一二区| 综合激情国产一区| 国产91成人在在线播放| 日本久久久a级免费| 久久精品国产欧美激情| 亚州精品天堂中文字幕| 韩日欧美一区二区| 在线观看精品自拍私拍| 国产伦精品一区二区三区精品视频| 亚洲美女av电影| 亚洲电影在线观看| 国产原创欧美精品| 成人免费观看49www在线观看| 国产成人精品综合久久久| 国产丝袜精品视频| 一个人看的www欧美| 欧美日本精品在线| 国产亚洲人成网站在线观看| 91精品91久久久久久| 日韩欧美福利视频| 国产美女高潮久久白浆| 法国裸体一区二区| 午夜精品99久久免费| 亚洲国产小视频在线观看| www.色综合| 亚洲精品久久久久久久久久久久久| 精品五月天久久| 日产精品久久久一区二区福利| 亚洲第一在线视频| 在线日韩精品视频| 夜夜嗨av色综合久久久综合网| 欧美另类交人妖| 亚洲高清福利视频| 欧美在线观看日本一区| 91精品视频在线| 国产精品劲爆视频| 亚洲美女自拍视频| 亚洲在线视频观看| 欧洲午夜精品久久久| 日韩欧美在线视频观看| 久久久国产视频91| 欧美黑人国产人伦爽爽爽| 亚洲欧洲日本专区| 亚洲伊人第一页| 一本色道久久88精品综合| 国产午夜精品全部视频播放| 亚洲精品720p| 国外成人在线播放| 国产精品高潮视频| 色视频www在线播放国产成人| 久久久精品网站| 中文字幕精品影院| 尤物九九久久国产精品的分类| 在线播放日韩精品| 中文字幕日韩欧美在线视频| 亚洲精品一区在线观看香蕉| 91精品国产免费久久久久久| 国产成人精品综合| 亚洲第一av网站| 亚洲欧美日韩视频一区| 久久久免费精品| 91在线免费视频| 欧美一区在线直播| 91极品视频在线| 北条麻妃一区二区三区中文字幕| 97热精品视频官网| 亚洲一级免费视频| 波霸ol色综合久久| 色天天综合狠狠色| 91国偷自产一区二区三区的观看方式| 日韩av在线免费播放| 日韩成人在线视频网站| 91豆花精品一区| 亚洲国产福利在线| 午夜精品久久久久久久久久久久久| 国产亚洲成av人片在线观看桃| 欧美麻豆久久久久久中文| 91丝袜美腿美女视频网站| 精品国产一区二区三区久久久| 精品毛片网大全| 粗暴蹂躏中文一区二区三区| 久久久久国产视频| 日韩视频免费观看| 久久精品国产一区二区三区| 色噜噜狠狠狠综合曰曰曰| 国产精品高潮呻吟久久av黑人| 日韩成人中文字幕| 欧美黑人巨大xxx极品| 日韩激情视频在线播放| 亚洲第一视频网站| 狠狠色狠狠色综合日日五| 亚洲人成电影网站色xx| 国产精品爱久久久久久久| 国产亚洲精品91在线| 日韩欧美综合在线视频| www日韩中文字幕在线看| 欧美丰满少妇xxxxx| 久久精品一偷一偷国产| 日韩免费观看视频| 中文字幕在线看视频国产欧美在线看完整| 欧美在线www| 欧美极品少妇全裸体| 欧美老女人性生活| 亚洲大尺度美女在线| 国产精品久久久久久久久男| 亚洲欧美中文日韩v在线观看| 91精品视频在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 精品亚洲夜色av98在线观看| 色偷偷91综合久久噜噜|