如何创建全局配置文件?

时间:2011-05-11 22:34:00

标签: php mysql static configuration-files

是否有可能使用在类中可见的全局变量创建配置文件?类似的东西:

的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 个答案:

答案 0 :(得分:11)

每个人都有自己的偏好。我更喜欢将我的数据库设置存储在webroot之外的.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数组中得到了用户名等。

我强烈建议避免将任何类型的数据库信息存储到CONSTANTGLOBAL类型变量中。这样,$settings仅对该类函数可用,而不提供额外的安全层。

答案 1 :(得分:6)

您的问题是您尝试在此类定义中使用表达式

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

这在语法上是不正确的(你只能使用常量值),我不希望它在那里找到预期的范围。你应该做的是改为在construtor中初始化这个属性:

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作为局部变量,这就是你所需要的。

答案 2 :(得分:-1)

您可以尝试定义:

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

`用法:

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