我正在构建我的第一个PHP OO项目,我非常努力避免代码重复,并使用数据库和类设计的最佳实践。
我有一个问题是关于我的DAO以及他们如何获得/使用数据库连接。
这是我目前看到的;
class DbConfig
{
protected $db_host = 'hardcoded_host';
protected $db_name = 'hardcoded_dbname';
protected $db_user = 'hardcoded_user';
protected $db_pass = 'hardcoded_pass';
}
正如您所看到的——这些值是硬编码的,然后我用我的DAO扩展这个类,这意味着我只需要在一个地方修改这些细节。
class Dao extends dbConfig
{
private $dbh;
public function __construct()
{
// create $dbh PDO connection here and assign to private $dbh
$this->dbh = $dbh;
}
public function createUser($username, $password)
{
// use $dbh connection and insert new user to db
}
public function checkUserCredentials($username, $password)
{
// used to check login details
}
public function createClient($name)
{
// as with createUser, except for client
}
}
如您所见,我在多个数据库表/类型-用户和客户端上执行CRUD操作。
我认为如果我有一个用户DAO和一个客户端DAO(因为需要的比这两个还要多),代码将会更好地调制,更容易理解——但我看到的问题是,我必须将连接编码到每个DAO中。
或者我将有一个连接类并通过DAO的构造函数传递它—这是一个更好的选择吗?我看到的唯一问题是,在实例化每个DAO之前,我必须实例化一个连接类——并将其传递给所有DAO的每个方法。
,
$dbh = new databaseConnection();
$user = new UserDao();
$user->createUser($dbh);
这对我来说似乎是不必要的额外代码。
我应该只使用一个DAO吗?或者,如果我创建多个DAO,是否有一种方法可以避免将连接方法写入每个DAO ?也许是利用一种特质?
编辑:另一个选项-在我的父类DbConfig中创建连接(问题的顶部),然后在每个DAO的构造函数中调用parent::construct。我可以预见这个方法的问题是,我不能在子类中添加任何其他初始化代码。
谢谢
我解决这个问题的方法是有一个名为DbConnection
的类。我把这个类设为单例类,所以我有一个方法public static DbConnection getConnection() {...}
。在您的情况下,这个类可以由DbConfig
继承以获得db凭据。
根据这里提供的代码,还有另一种方法可以做到这一点。所以你写:
我认为如果我有一个用户DAO和一个客户端DAO(因为需要的比这两个还要多),代码将会更好地调制,更容易理解——但我看到的问题是,我必须将连接编码到每个DAO中。
和
我应该只使用一个DAO吗?或者,如果我创建多个DAO,是否有一种方法可以避免将连接方法写入每个DAO ?也许是利用一种特质?
您可以在此class Dao
中编写protected void connect()
方法,并为Dao
继承的其他dao类型类创建。因此,您只编写了一次连接,但可以从所有其他dao访问它。
这里有一个代码示例;)这是基于你的代码!
class Dao extends DbConfig {
/*
* @type PDO
*/
private $dbConnection;
public function __construct() {
// connect to db
}
}
class UserDao extends Dao {
// some other stuff explicit to this class
public function __construct() {
parent::__construct();
}
}
希望我理解对了,这对你有帮助!
问候,
克莱门斯