我正在构建我的第一个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?或许使用特征?
编辑:另一种选择 - 在我的父类DbConfig(问题的顶部)中创建te连接,然后在每个DAO的构造函数中调用parent :: construct。我可以通过这种方法预见到的问题是,我无法在子类中添加任何其他初始化代码。
由于
答案 0 :(得分:1)
我正在解决这个问题的方法是拥有一个名为DbConnection
的类。我把这个类变成了一个singelton类,所以我有一个方法public static DbConnection getConnection() {...}
。
在您的情况下,此类可以由DbConfig
继承以获取数据库凭据。
根据您提供的代码,还有另一种方法可以做到这一点。所以你写道:
我认为如果我有一个用户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();
}
}
希望我帮助你,这对你有所帮助!
此致
克莱门