>А "парюсь" я из-за того, что прасинг xml - дело не из дешевых.
Таки цепляют меня задачки =)
Смотрим что можно сделать. Причём за условие я беру только указанное: настройки в одном xml-файле. Главное ограничение: всё в одном файле. Т.е. решение будет в любом случае подвидом двух приведённых. Ограничение №2: я не слишком шарю в XML, так что использовать буду SimpleXML. Вариант №1 мне не нравится по банальным причинам, поэтому оставим его. Остался вариант №2. Пусть парсинг XML занимет время мизерное по сравнению с созданием объектов. Тогда ConfigManager будет выглядеть как-то так:
PHP:
class ConfigManager {
private $xml;
private $instances = array();
public function __construct($xmlFile) {
$this->xml = simplexml_load_file($xmlFile);
}
public function getX()
{
if (!isset($this->instances['X'])) {
$this->instances['X'] = $this->createClass('X');
}
return $this->instances['X'];
}
...
}
Т.е. вариант ФорДжеста.
Теперь вернёмся к тому, что парсинг XML занимает время, которым нельзя пренебречь. К счастью, есть такая функция как [m]simplexml_load_string[/m]. Вопрос, как заполучить строку, содержащую xml, описывающий объект класса X.
PHP:
class ConfigManager {
private $xml = array();
private $instances = array();
public function __construct($xmlFile) {
//$this->xml должен стать типа:
//array (
//'X' => 'xml_not_parsed_string',
//...
//)
//сделать это можно регулярными выражениями, например
}
public function getX()
{
if (!isset($this->instances['X'])) {
$this->instances['X'] = $this->createClass('X', simplexml_load_string($this->xml['X']));
}
return $this->instances['X'];
}
...
}
Уже лучше. Может быть: регулярки вещь тоже не самая быстрая. А что быстрого придумали люди? Я знаю только индексы =)
PHP:
class ConfigManager {
private $xmlFile;
private $index;
private $instances = array();
public function __construct($xmlFile, $indexFile) {
$this->xmlFile= $xmlFile;
$this->index = new IndexProcessor($indexFile);
}
public function getX()
{
if (!isset($this->instances['X'])) {
list($startBytes, $endBytes) = $this->index->getClassPosition('X');
//считываем с $startBytes по $endBytes из xml-файла и
//присваиваем результат $xml
$this->instances['X'] = $this->createClass('X', simplexml_load_string($xml));
}
return $this->instances['X'];
}
...
}