DAO中的PHP数据库连接

时间:2015-10-10 21:28:52

标签: php mysql pdo

我正在构建我的第一个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。我可以通过这种方法预见到的问题是,我无法在子类中添加任何其他初始化代码。

由于

1 个答案:

答案 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();
   }
}

希望我帮助你,这对你有所帮助!

此致

克莱门