2011-05-11 82 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僅適用於該類功能,沒有其他功能,可提供額外的安全層。