Как создать глобальный файл конфигурации? - PullRequest
8 голосов
/ 12 мая 2011

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

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']);
    ...

Текущий объект:

private $ _config = array();

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

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

Ответы [ 3 ]

11 голосов
/ 12 мая 2011

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

Пример .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 доступен только для этой функции класса и ничего больше, предоставляя дополнительный бит уровня безопасности.

6 голосов
/ 12 мая 2011

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

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. Таким образом, ваш скрипт конфигурации будет извлекать $ config как локальную переменную внутри конструктора, и это все, что вам нужно.

0 голосов
/ 12 мая 2011

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

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

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

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