配置文件中有很多全局变量,特别是与数据库相关的变量,我应该做一个数据库层吗


A lot of global vars in config file especialle db related, shall I make a db-layer?

我有一个config.php文件,其中包含一些全局变量:基本上,它们中的大多数都与连接到我的数据库有关。

一个例子:

$WEBDBHOST = 'localhost';
$WEBDBPORT = '3306';
$WEBDBNAME = 'db';
$WEBDBUSERNAME = 'root';
$WEBDBPASSWORD = '' ;

大多数时候它的使用方式是:

$dbw = new PDO("mysql:host=$WEBDBHOST;port=$WEBDBPORT;dbname=$WEBDBNAME", $WEBDBUSERNAME, $WEBDBPASSWORD);

这在我看来一点效率都没有!如何改进我的代码?我应该创建一个包含全局变量的数据库层,并创建一个返回新pdo对象的getWEBDB()吗?

或者有更好的方法来处理这个问题吗?请记住,我有不止一个DB,所以我在考虑getWebDB()、getGameDB()等。

是的,您应该创建一个数据库层。每个人都应该。

不,不是因为"配置文件中有很多全局变量"。事实上,应该只有一个全局变量

$cfg['db']['game']['host']    = 'localhost';
$cfg['db']['game']['port']    = '3306';
$cfg['db']['game']['base']    = 'db';
$cfg['db']['game']['user']    = 'root';
$cfg['db']['game']['pass']    = '';
$cfg['db']['game']['charset'] = 'utf8';

现在,您可以将所需的配置选项传递给类似的类

$gamedb = new DBLayer($cfg['game']);

并且有像这个这样的构造函数

function __construct($db)
{
    $dsn  = "mysql:";
    $dsn .= "host=".   $db['host'].";";
    $dsn .= "dbname=". $db['name'].";";
    $dsn .= "port=".   $db['port'].";";
    $dsn .= "charset=".$db['charset'];
    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    return new PDO($dsn,$db['user'],$db['pass'], $opt);
}