PHP数据库连接在DAO'


PHP Database connection in DAO's

我正在构建我的第一个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();
   }
}

希望我理解对了,这对你有帮助!

问候,

克莱门斯