Для моего проекта я написал небольшой класс конфигурации, который загружает данные из файла .ini. Он перезаписывает магический метод __get () для обеспечения упрощенного доступа к (только для чтения) значениям конфигурации.
Пример config.ini.php:
;<?php exit; ?>
[General]
auth = 1
user = "halfdan"
[Database]
host = "127.0.0.1"
Мой класс конфигурации (шаблон синглтона - здесь упрощенно) выглядит следующим образом:
class Config {
protected $config = array();
protected function __construct($file) {
// Preserve sections
$this->config = parse_ini_file($file, TRUE);
}
public function __get($name) {
return $this->config[$name];
}
}
Загрузка конфигурации создаст структуру массива следующим образом:
array(
"General" => array(
"auth" => 1,
"user" => "halfdan"
),
"Database" => array(
"host" => "127.0.0.1"
)
)
Можно получить доступ к первому уровню массива, выполнив Config::getInstance()->General
, а значения используя Config::getInstance()->General['user']
. Однако я действительно хочу получить доступ ко всем переменным конфигурации, выполнив Config::getInstance()->General->user
(синтаксический сахар). Массив не является объектом, и «->» не определен для него, поэтому это просто не работает.
Я подумал о решении и хотел бы узнать о нем общественное мнение:
class Config {
[..]
public function __get($name) {
if(is_array($this->config[$name])) {
return new ConfigArray($this->config[$name]);
} else {
return $this->config[$name];
}
}
}
class ConfigArray {
protected $config;
public function __construct($array) {
$this->config = $array;
}
public function __get($name) {
if(is_array($this->config[$name])) {
return new ConfigArray($this->config[$name]);
} else {
return $this->config[$name];
}
}
}
Это позволило бы мне связать доступ к конфигурации. Поскольку я использую PHP 5.3, было бы также неплохо разрешить ConfigArray расширить ArrayObject (SPL активирован по умолчанию в 5.3).
Есть предложения, улучшения, комментарии?