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として、密結合が発生するため、他のクラス内でキーワードを使用することは避けた方がよい場合があります。これは、保守性 (クラスの署名を見てクラスが使用されているかどうかを判断するのは難しい)、テスト可能性 (クラスを簡単に交換できない) などを損なうことになります。他のクラス内に新しいインスタンスを構築する必要がある場合 (この特定のケースでは上記のように、実際には必要ありません)ファクトリパターンを実装することをお勧めします:

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 に答える