Я склонен использовать статический класс Settings в PHP, это потому, что
- Он имеет глобальную область действия.
- Вы можете включать / отключать изменения в защищенных конфигурациях.
- Вы можете добавлять любые настройки в любое время в пределах среды выполнения.
- Вы можете сделать класс автоматизированным для извлечения открытых конфигов из файла / базы данных.
Пример:
abstract class Settings
{
static private $protected = array(); // For DB / passwords etc
static private $public = array(); // For all public strings such as meta stuff for site
public static function getProtected($key)
{
return isset(self::$protected[$key]) ? self::$protected[$key] : false;
}
public static function getPublic($key)
{
return isset(self::$public[$key]) ? self::$public[$key] : false;
}
public static function setProtected($key,$value)
{
self::$protected[$key] = $value;
}
public static function setPublic($key,$value)
{
self::$public[$key] = $value;
}
public function __get($key)
{//$this->key // returns public->key
return isset(self::$public[$key]) ? self::$public[$key] : false;
}
public function __isset($key)
{
return isset(self::$public[$key]);
}
}
Тогда в вашей среде выполнения, если вы сначала загрузили этот файл, а затем ваш файл конфигурации базы данных, ваш файл конфигурации базы данных будет выглядеть так:
<?php
Settings::setProtected('db_hostname', 'localhost');
Settings::setProtected('db_username', 'root');
Settings::setProtected('db_password', '');
Settings::setProtected('db_database', 'root');
Settings::setProtected('db_charset', 'UTF-8');
//...
echo Settings::getProtected('db_hostname'); // localhost
//...
Settings::setPublic('config_site_title', 'MySiteTitle');
Settings::setPublic('config_site_charset', 'UTF-8');
Settings::setPublic('config_site_root', 'http://localhost/dev/');
Как вы можете видеть, мы имеемметод __get
, который должен быть разрешен только для получения открытых переменных. Пример того, почему мы имеем это, выглядит следующим образом:
$template = new Template();
$template->assign('settings', new Settings());
Независимо от того, что мы использовали этот объект в качестве статического объекта,значения должны оставаться такими, как в шаблоне, который вы теперь можете сделать, скажем.
<html>
<head>
<?php echo isset($settings->config_site_title) ? $settings->config_site_title : 'Fallback Title'; ?>
</head>
</html>
И это позволит вам иметь доступ к общедоступным данным только в течение начального периода.
Этоможет получить много мосложный, но более дружественный к системе, некоторые примеры:
- A
loadConfig
метод автоматического разбора файла конфигурации, xml, php, yaml. - Если вы регистрируете
shutdown_function
вы можете автоматически обновить базу данных новыми настройками. - Вы можете автоматически заполнить класс конфигурацией из этой базы данных.
- Вы можете реализовать итераторы, чтобы сделать его совместимым с циклом.
- Много больше.
Это тоже я, безусловно, лучший способ выполнить эту работу.