如何创建全局配置文件?

luz*_*zny 8 php mysql static configuration-files

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

config.php文件:

$config['host_address'] = 'localhost';
$config['username '] = 'root';
$config['password'] = 'root';
$config['name'] = 'data';
Run Code Online (Sandbox Code Playgroud)

db.php中:

include('config.php');
class DB
{
    private $_config = array($config['host_address'], $config['username'], $config['password'], $config['name']);
    ...
Run Code Online (Sandbox Code Playgroud)

目前的财产:

private $ _config = array();
Run Code Online (Sandbox Code Playgroud)

我不想通过构造函数传递给我的Singleton数据库连接器:

DB::getInstance(array('localhost', 'root', 'root', 'data'));
Run Code Online (Sandbox Code Playgroud)

Jim*_* W. 11

每个人都有自己的喜好.我更喜欢将我的数据库设置存储在webroot之外的.ini中,然后给它一个0600 chmod值,以防止除了所有者阅读之外的任何人.

示例.ini将如下所示:

[database]
driver = mysql
host = localhost
;port = 3306
schema = yourdbname
username = dbusername
password = some_pass
Run Code Online (Sandbox Code Playgroud)

然后你可以使用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']);
}
Run Code Online (Sandbox Code Playgroud)

而且,中提琴,您可以通过简单而安全的方式设置数据库连接.这个类来自PDO扩展器类,所以如果你不使用PDO,你需要改变那一行,但是你可以看到你在$settings数组中获得用户名等.

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


mar*_*rio 6

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

class DB
{
    private $_config = array($config['host_address'], ...
Run Code Online (Sandbox Code Playgroud)

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

class DB
{
    private $_config;

    function __construct() {
        global $config;
        $this->_config = array($config['host_address'], $config['username'], $config['password'], $config['name']);
    }
Run Code Online (Sandbox Code Playgroud)

甚至更懒,只是用来include('config.php');代替global $config别名.这样你的配置脚本就会在构造函数中提取$ config作为局部变量,这就是你所需要的.