以下是为您指定它具有单一功能导入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
函数,因为您重新使用v良莠不齐。用法:
$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;
}
}
然而,这是实验性质的。第一个建议更直接,更容易处理。请记住,你的配置对象应该非常简单,它只需要存储一些值,就是这样。
精确复制:http://stackoverflow.com/questions/1869091/convert-array-to-object-php?rq=1 – Dev
Zend_Config_Ini的已经这样做了相当不错。 –
Jon,谢谢,我已经看到了Zend ini解析器,它们遵循它解析的某种模式。它是一个巨大的功能。我从zend转移的主要原因是,它太多了我正在做的应用程序... – Karthik