【发布时间】:2015-04-28 15:33:30
【问题描述】:
我有一个用于数据库连接到 mySQL 数据库的类,这个类具有广泛的功能,完全是我自己的工作,我将它复制并粘贴到新项目中。
该类包含三个私有变量,用于数据库名称、用户和密码。
目前,这些值在构建时在类中手动设置为:
class database {
private $dbUser = "username";
private $dbPass = "pass";
private $dbName = "database";
public $dbLink = null; //the placeholder for the database object.
public function __construct(){
$this->dbConnect();
}
private function dbConnect(){
$this->dbLink = new mysqli("localhost", $this->dbUser, $this->dbPass, $this->dbName);
///simplified
return true;
}
}
但是,当我扩展和编辑我的数据库类,并向该类添加新的功能和方法时,我发现我想在它运行的所有站点上更新类文件,每个站点都有自己的数据库连接和日志因此它不像复制/粘贴或Save As... 那样简单,因为我需要在每个数据库类文件中保留数据库连接详细信息。
那么,我想知道的是,是否有一种既定的“正确”方式应该这样做?如果是这样,它是什么,因为我在 Google 和 StackOverflow 搜索中发现的将数据从另一个文件导入到类中的结果令人惊讶地少。
可能的想法:
有一个包含连接详细信息的基类,然后是一个包含所有方法等的扩展类,这些方法可以在不丢失连接详细信息的情况下轻松更新。
将连接详细信息保存在另一个文件中,并在
__construct方法中使用file_get_contents将它们作为字符串导入。在类中使用
include()调用直接导入变量值。
我正在考虑创建另一个文件,其中包含连接详细信息,然后可以在构造数据库类时将其导入到数据库类中。
但我很谨慎,因为我不希望数据库连接详细信息公开可用,例如作为connection.txt 文件或类似的东西。此外,我觉得将类作为空原件的扩展总体上可能会更好,但要让我当前的站点/数据库类对象变成这种新形状会做更多的工作。
应该如何使用不包含在类本身中的特定数据来实现类。这样我就可以继续更新和覆盖类而不用担心覆盖数据库连接细节?
更新/澄清
将详细信息作为参数传递给构造函数并不能解决我需要将这些参数存储在程序员可以在需要时更新它们的地方的问题,但是。我可以使用file_get_contents将它们从另一个文件传递给构造函数。
连接:
每个网站都会从类中为 $dbLink 创建一个对象,__construct 将在每个页面、每个网站上运行一次。
【问题讨论】:
-
数据库连接调用了多少个地方?
-
如何将细节作为参数传递给构造函数并在那里设置类变量?
-
每个网站都有自己的数据库类,其中包含网站特定的数据库连接详细信息。我会更新我的问题...
-
在这样一个通用类中存储硬编码的细节不是一个好主意,因为它不是很便携(就像你刚刚发现的那样)。该类在某处被实例化,这是您将详细信息传递给构造函数的地方。
-
是的,我找到了这个,@chris --- 你会说什么是解决这种困境的好方法?