以下是一个基本类,它具有一个函数来导入您指定的 ini 数组:
/**
* Config "Class"
* @link http://stackoverflow.com/q/11188563/367456
*/
class Config
{
public function __construct(array $array = array())
{
$this->importIniArray($array);
}
public function importIniArray(array $array)
{
foreach ($array as $key => $value) {
$rv = &$this;
foreach (explode('.', $key) as $pk) {
isset($rv->$pk) || $rv->$pk = new stdClass;
$rv = &$rv->$pk;
}
$rv = $value;
}
}
}
我只添加了该__construct
函数,因为您重复使用了该变量。用法:
$config = parse_ini_file($path);
$config = new Config($config['production']);
print_r($config);
示例输出:
Config Object
(
[db] => stdClass Object
(
[mongo] => stdClass Object
(
[hostname] => localhost
[user] => root
)
)
)
编辑:您还可以解决在访问时定位数组成员的问题。我编译了一个行为相似的小例子,它没有爆炸。我之所以称之为它,DynConfig
是因为您会看到它是动态的(或魔术的):
$config = new DynConfig($config['production']);
var_dump($config);
echo $config->db->mongo->hostname; # localhost
这var_dump
表明该数组只是在内部保留:
object(DynConfig)#1 (1) {
["array":"DynConfig":private]=>
array(2) {
["db.mongo.hostname"]=>
string(9) "localhost"
["db.mongo.user"]=>
string(4) "root"
}
}
那么这是如何工作的呢?每次访问属性时,要么存在键,要么扩展前缀并返回相同的对象。那是在__get
函数中:
/**
* Config "Class"
* @link http://stackoverflow.com/q/11188563/367456
*/
class DynConfig
{
private $array;
public function __construct($array)
{
$this->array = $array;
}
public function __get($name)
{
static $prefix = '';
$k = $prefix .= $name;
if (isset($this->array[$k])) {
$prefix = '';
return $this->array[$k];
}
$prefix .= '.';
return $this;
}
}
然而,这是实验性质的。第一个建议更直接,也更容易处理。请记住,您的配置对象应该非常简单,它只需要存储一些值即可。