当前位置:首页 > PHP教程 > php类库 > 列表

一个非常完美的读写ini格式的PHP配置类分享

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-13 11:24:49 浏览: 评论:0 

这篇文章主要介绍了一个非常完美的读写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.  } 
  46.  $section = 'production'
  47.  $hostname = gethostname (); 
  48.  foreach ( $map as $k => $v ) { 
  49.   if (is_array ( $v )) { 
  50.   foreach ( $v as $v1 ) { 
  51.    if ($v1 == $hostname) { 
  52.    $section = $k
  53.    break 2; 
  54.    } 
  55.   } 
  56.   } elseif (is_callable ( $v )) { 
  57.   if (true == call_user_func ( $v )) { 
  58.    $section = $k
  59.    break
  60.   } 
  61.   } else { 
  62.   throw new ErrorException ( 'Wrong map value in ' . __CLASS__ ); 
  63.   } 
  64.  } 
  65.  $this->config = $config->$section
  66.  } 
  67.    
  68.  /** 
  69.  * 总是返回配置对象 
  70.  * 
  71.  * @return mixed 
  72.  */ 
  73.  function __get($key) { 
  74.  if (isset ( $this->config->$key )) { 
  75.   return $this->config->$key
  76.  } 
  77.  } 
  78.    
  79.  /** 
  80.  * 切分 
  81.  * 
  82.  * @param stdClass $v      
  83.  * @param string $k1      
  84.  * @param mixed $v1      
  85.  */ 
  86.  private function split($v$k1$v1) { 
  87.  $keys = explode ( '.'$k1 ); 
  88.  $last = array_pop ( $keys ); 
  89.  $node = $v
  90.  foreach ( $keys as $v2 ) { 
  91.   if (! isset ( $node->$v2 )) { 
  92.   $node->$v2 = new stdClass (); 
  93.   } 
  94.   $node = $node->$v2
  95.  } 
  96.  $node->$last = $v1
  97.  if (count ( $keys ) > 0) { 
  98.   unset ( $v->$k1 ); 
  99.  } 
  100.  } 
  101.    
  102.  /** 
  103.  * parseIni 
  104.  * 
  105.  * @param object $conf      
  106.  * @return stdClass 
  107.  */ 
  108.  private function parseIni($conf) { 
  109.  $confObj = new stdClass (); 
  110.  foreach ( $conf as $k => $v ) { 
  111.   // 是section 
  112.   if (is_array ( $v )) { 
  113.   $confObj->$k = ( object ) $v
  114.   foreach ( $v as $k1 => $v1 ) { 
  115.    call_user_func ( array ( 
  116.     $this
  117.     'split' ), $confObj->$k$k1$v1 ); 
  118.   } 
  119.   } else { 
  120.   call_user_func ( array ( 
  121.    $this
  122.    'split' ), $confObj$k$v ); 
  123.   } 
  124.  } 
  125.  unset ( $conf ); 
  126.  // 处理继承 
  127.  foreach ( $confObj as $k => $v ) { 
  128.   if (false !== strpos ( $k':' )) { 
  129.   if (0 === strpos ( $k':' )) { 
  130.    throw new ErrorException ( 'config ' . $k . ' is invalid, ':' can't be the first char' ); 
  131.   } elseif (1 < substr_count ( $k':' )) { 
  132.    throw new ErrorException ( 'config ' . $k . ' is invalid, ':' can appear only once' ); 
  133.   } else { 
  134.    $keys = explode ( ':'$k ); 
  135.    if (! isset ( $confObj->$keys [1] )) { 
  136.    throw new ErrorException ( 'parent section ' . $keys [1] . ' doesn't exist in config file' ); 
  137.    } else { 
  138.    if (isset ( $confObj->$keys [0] )) { 
  139.     throw new ErrorException ( 'config is invalid, ' . $keys [0] . ' and ' . $k . ' conflicts' ); 
  140.    } else { 
  141.     $confObj->$keys [0] = $this->deepCloneR ( $confObj->$keys [1] ); 
  142.     $this->objectMergeR ( $confObj->$keys [0], $v ); 
  143.     unset ( $confObj->$k ); 
  144.    } 
  145.    } 
  146.   } 
  147.   } 
  148.  } 
  149.  return $confObj
  150.  } 
  151.    
  152.  /** 
  153.  * php默认是浅克隆,函数实现深克隆 
  154.  * 
  155.  * @param object $obj      
  156.  * @return object $obj 
  157.  */ 
  158.  private function deepCloneR($obj) { 
  159.  $objClone = clone $obj
  160.  foreach ( $objClone as $k => $v ) { 
  161.   if (is_object ( $v )) { 
  162.   $objClone->$k = $this->deepCloneR ( $v ); 
  163.   } 
  164.  } 
  165.  return $objClone
  166.  } 
  167.    
  168.  /** 
  169.  * 递归的合并两个对象 
  170.  * 
  171.  * @param unknown $obj1      
  172.  * @param unknown $obj2      
  173.  */ 
  174.  private function objectMergeR($obj1$obj2) { 
  175.  foreach ( $obj2 as $k => $v ) { 
  176.   if (is_object ( $v ) && isset ( $obj1->$k ) && is_object ( $obj1->$k )) { 
  177.   $this->objectMergeR ( $obj1->$k$v ); 
  178.   } else { 
  179.   $obj1->$k = $v
  180.   } 
  181.  } 
  182.  } 

简单使用:

  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

Tags: ini PHP配置类

分享到: