国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金阳县| 江永县| 浪卡子县| 郓城县| 福安市| 怀宁县| 达孜县| 临西县| 林甸县| 海口市| 简阳市| 运城市| 观塘区| 崇左市| 界首市| 内丘县| 咸丰县| 丰城市| 武夷山市| 英吉沙县| 清流县| 石门县| 东台市| 阳山县| 同心县| 仙居县| 安乡县| 万安县| 许昌县| 晋江市| 府谷县| 蓬安县| 沛县| 卓尼县| 万州区| 买车| 繁峙县| 汾阳市| 壶关县| 壶关县| 岗巴县|