Как создать глобальный файл конфигурации?

Есть ли возможность создать файл конфигурации с глобальными переменными, которые видны внутри класса? Что-то похожее на это:

config.php:

$config['host_address'] = 'localhost'; $config['username '] = 'root'; $config['password'] = 'root'; $config['name'] = 'data'; 

db.php:

 include('config.php'); class DB { private $_config = array($config['host_address'], $config['username'], $config['password'], $config['name']); ... в include('config.php'); class DB { private $_config = array($config['host_address'], $config['username'], $config['password'], $config['name']); ... 

Текущая собственность:

 private $ _config = array(); 

Я не хочу передавать через конструктор мой соединитель базы данных Singleton:

 DB::getInstance(array('localhost', 'root', 'root', 'data')); 

Ваша проблема заключается в том, что вы пытаетесь использовать выражение в определении класса здесь:

 class DB { private $_config = array($config['host_address'], ... 

Это синтаксически некорректно (вы можете использовать только постоянные значения для этого), и я не ожидал, что он найдет там намеченный объем. Вместо этого вы должны инициализировать это свойство в конструкторе:

 class DB { private $_config; function __construct() { global $config; $this->_config = array($config['host_address'], $config['username'], $config['password'], $config['name']); } 

Или даже более ленивый, просто используйте include('config.php'); вместо global $config псевдонима global $config . Таким образом, ваш скрипт config будет извлекать $ config в качестве локальной переменной внутри конструктора, и это все, что вам нужно.

У каждого свои предпочтения. Я предпочитаю хранить настройки своего БД в .ini за пределами веб-корня, а затем дать ему значение 0600 chmod, чтобы кто-то, кроме владельца, не читал его.

Пример .ini будет выглядеть так:

 [database] driver = mysql host = localhost ;port = 3306 schema = yourdbname username = dbusername password = some_pass 

Затем вы можете использовать php-функцию parse_ini_file затем в своем конструкторе вы просто прочтете это и проанализируете его в массив:

 public function __construct($file = 'dbsettings.ini') { // @todo: change this path to be consistent with outside your webroot $file = '../' . $file; if (!$settings = parse_ini_file($file, TRUE)) throw new exception('Unable to open ' . $file . '.'); $dns = $settings['database']['driver'] . ':host=' . $settings['database']['host'] . ((!empty($settings['database']['port'])) ? (';port=' . $settings['database']['port']) : '') . ';dbname=' . $settings['database']['schema']; // if not PDO, this part needs to be changed parent::__construct($dns, $settings['database']['username'], $settings['database']['password']); } 

И альт, у вас есть простой и безопасный способ настройки соединения с базой данных. Этот класс был взят из класса расширителя PDO, поэтому, если вы не используете PDO, вам нужно изменить эту строку, но, как вы видите, вы получаете имя пользователя и т. Д. В массиве $settings .

Я бы очень хотел избежать хранения информации о любом типе базы данных в переменной CONSTANT или GLOBAL . Таким образом, $settings доступны только для этой функции класса и ничего больше, обеспечивая дополнительный бит уровня безопасности.

Вы можете попробовать:

 define('host_address', 'root'); define('username', 'root'); 

`Использование:

 DB::getInstance(array(host_address, username, ...));