1

我刚刚开始使用 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 );    
    } 
} 
4

2 回答 2

6

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

恕我直言,一个更好的选择是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在其他类中使用关键字,因为它们引入了紧密耦合。这会损害可维护性(通过查看类签名很难判断该类是否被使用),可测试性(您不能轻易交换类)等。如果您确实需要在其他类中构建新实例(在这种特定情况下是真的不需要 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();
    }
}

这也防止了代码的紧密耦合。

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

于 2013-02-26T09:19:26.397 回答
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);
  }
}
于 2013-02-26T01:52:00.383 回答