数据库连接类构造函数

时间:2013-02-26 01:43:51

标签: php database oop connection construct

关于这个话题有一百万个问题..但我没有看到它完全像这样。我刚刚开始使用OOP PHP,所有的信息都是关于一辆红色或蓝色的汽车...很难让我只关注数据库连接对象。

我有一种令人难以置信的怀疑,即我的__construct()不应该有连接字符串,而是它在类中的自己的方法..但它的工作原理......

如下所示定义我的连接类是不正确的..如果它错了 - 应该怎么看?

谢谢!

class dbConnect {

    // Declare connection info for PDO
    private $dbType = 'mysql';
    private $dbHost = 'localhost';
    private $dbUser = 'user';
    private $dbPass = 'password';
    private $dbName = 'db';

    // Declare connection variable for object
    private $dbConn;

    // Construct object
    private function __construct() {

        // Create Database connection and assign it to object as dbConn
        $this -> dbConn = new PDO( $this -> dbType . ':' . 'host=' . $this -> dbHost . ';' . 'dbname=' . $this -> dbName , $this -> dbUser , $this -> dbPass );    
    } 
} 

2 个答案:

答案 0 :(得分:5)

我不认为我认为你在做什么是非常有用的。看起来你将拥有一个数据库类。我只是看不到这样做的好处,因为PDO已经是一个类,所以没有必要扩展它,除非你有充分的理由这样做。

更好的选择imho是在bootstrap阶段初始化PDO实例并在需要它的类中注入连接;

$dbConnection = new PDO('mysql:host=localhost;dbname=db', 'user', 'password');

$someInstance = new ClassThatNeedsDatabase($dbConnection);
$someInstance->doSomething();

class ClassThatNeedsDatabase
{
    private $dbConnection ;

    public function __construct(PDO $dbConnection)
    {
        $this->dbCOnnection = $dbConnection;
    }

    public function doSomething()
    {
        $stmt = $this->dbConnection->prepare('UPDATE....');

        // etc
    }

}

在一般说明中,您可能希望避免在其他类中使用new关键字,因为它们会引入紧密耦合。这会损害可维护性(很难通过查看类签名来判断类是什么),testablity(你不能轻易地交换类)等等。如果你真的需要在其他类中构建新实例(在这个特定情况下是真的不需要如上所述的imo)你可能想要实现工厂模式:

class Foo
{
    public function doSomething()
    {
    }
}

class FooFactory
{
    public function build()
    {
        return new Foo();
    }
}

class Bar
{
    private $fooFactory;

    public function __construct(FooFactory $fooFactory)
    {
        $this->fooFactory = $fooFactory;
    }

    public function soSomethingWhichNeedsToBuildAnInstance()
    {
        $foo = $this->fooFactory->build();
    }
}

这也可以防止代码紧密耦合。

以上命名很糟糕,但这只是为了说明这一点。 : - )

答案 1 :(得分:0)

是的,您应该extending现有的PDO对象。

这是你的基础:

define('DB_USER', 'username');
define('DB_PASS', 'password');
define('DB_DSN', 'dsn');

class dbConnect extends PDO {           
  public function __construct($user = DB_USER, $pass = DB_PASS, $dsn = DB_DSN) {
    parent::__construct($dsn, $user, $pass, $options);
  }
}