2011-05-11 69 views
6

有没有可能创建一个全局变量在类内可见的配置文件?一些与此类似:如何创建全局配置文件?

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

Current属性:

private $ _config = array(); 

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

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

回答

4

你的问题是,你正试图在类的定义在这里使用一个表达

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

+0

+ 1 Correctamundo! – webbiedave 2011-05-11 22:51:08

0

你可以试着定义:

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

`用法:

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

@Brad F Jacobs这不是最好的选择,但我们并不都有必要的访问权限来将我们的配置文件放在webroot之外。 – 2011-05-11 23:06:56

+0

@Brad F Jacobs给出的例子证明或没有发生 – Andrew 2014-02-11 11:33:32

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仅适用于该类功能,没有其他功能,可提供额外的安全层。