Мне любопытно - как вы думаете, какую именно гибкость вы получаете от этого?Вы проделали огромную работу, чтобы поместить материал в XML, просто чтобы преобразовать его в данные PHP.
Если вы хорошо разбираетесь с XML (то есть, ничто другое не использует эту конфигурацию), почему бы и нетчто-то вроде этого?
class Config
{
private static $urls = array(
'LOGIN_URL' => array(
'scriptname' => 'secure_login.php'
, 'location' => 'optional/path/to/file'
)
, 'REDIRECTL' => array(
'scriptname' => 'redirect.php'
, 'location' => 'optional/path/to/file'
)
);
public static function getUrlArr( $alias )
{
if ( isset( self::$urls[$alias] ) )
{
return self::$urls[$alias];
}
throw new Exception( "URL alias '$alias' not defined" );
}
}
Также, как примечание, у меня есть некоторые оговорки относительно вашего выбора, чтобы добавить глагол (синтаксический анализ) в имя класса.Если вы собираетесь пойти по этому пути, попробуйте использовать существительное-представление этого глагола.
class XmlConfigParser {}
EDIT
В этом случае вы не можете иметь имена методов, которые ссылаются нак структуре узла XML (если вы не хотите попасть в мир метапрограммирования)
Действительно, что бы вы ни делали, вы просто будете создавать синтаксический сахар над выражением XPath
Вот примеры методов, которые вы можете использовать
// Use XPath from the client
$config->fetchAttributesByXpath( "/urls/url[@alias='LOGIN_URL']" );
// Abstract away the XPah
$config->fetchAttributes( 'urls.url', 'alias', 'LOGIN_URL' );
Например, symfony делает что-то подобное со своими файлами конфигурации, которые являются YAML.В конфигурационном файле, например,
// app.yml
urls:
LOGIN_URL: {scriptname: 'secure_login.php', location='optional/path/to/file'}
Вы получите значение примерно так:
$values = sfConfig::get( 'app_urls_LOGIN_URL' );