Есть ли возможность создать файл конфигурации с глобальными переменными, которые видны внутри класса? Что-то похожее на это:
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, ...));