2012-03-15 15 views
7

私はPDOとPHPの一般的なOOPを新しくしていますので素敵です:)基本的に私はPDOに基づいて接続オブジェクトを作成しようとしています。PDO mysql静的接続クラスを作成する最良の方法は?

私は、以下で作成しようとしているのと同じdbオブジェクトを使用して渡すIDに基づいて、異なる結果を単に検索するプリペアドステートメントが必要です。

以下で設定したdbクラスを作成してアクセスするにはどうしたらいいですか?その中の関数を使用して、必要な関連情報を抽出しますか?どのような例も素晴らしいので、ベストプラクティスなどのアイデアを得ることができます。

事前に感謝します。

class db { 

    private static $connection; 

    private function __construct(){} 
    private function __clone(){} 

    private static function connect($db_server="localhost", $db_user="user", $db_pass="password") { 
     if(!$this->connection){ 
      try{ 
       $this->connection = new PDO($db_server, $db_user, $db_pass); 
      } catch (PDOException $e) { 
       $this->connection = null; 
       die($e->getMessage()); 
      } 
     } 
     return $this->connection; 
    } 

} 

$dbh = new db::connect(); 

$stmt = $dbh->prepare("SELECT * FROM questions where id = ?"); 
if($stmt->execute(array($_REQUEST['testid']))) { 
    while ($row = $stmt->fetch()) { 
    print_r($row); 
    } 
} 
+0

$ thisは静的メソッドの中や静的プロパティの中では利用できません。 self :: $ propertyを使うべきです。それ以外の場合は、プロパティdb :: propertyが定義されていないと言います。 – jscripter

+0

@BubuDabaは、他のアスンワーを無関係にすることができるので、問題の不適切なコードを編集しません。 OPの提案があれば、答えやコメントを書いてください –

答えて

5

を参照してください。それは、手続き型プログラミングのグローバル変数が悪いのと同じ理由から、悪い(一般的に静的なクラス)。

言い換えれば...接続オブジェクトの一意性を強制しようとするのではなく、すべての場所で同じ接続を使用していることを確認するだけです。

は、ここで私はそれによって何を意味するかの例です:

class Foo 
{ 
    protected $connection = null; 
    public function __construct(PDO $connection) 
    { 
     $this->connection = $connection; 
    } 
} 

class Bar 
{ 
    // all the same as in Foo 
} 

$connection = new PDO('sqlite::memory'); 

$foo = new Foo($connection); 
$bar = new Bar($connection); 

この時点で、両方$foo$barオブジェクトが同じ PDOインスタンスにアクセスする必要があります。データベースへのアクセスが必要なオブジェクトがある場合は、コンストラクタで接続を提供するだけです。

あなたが見たいと思うかもしれない2本のビデオがあります(スライドは、Javaコードが含まれていますが、あなたは何troble理解を持つべきではない):擬似変数

+0

なぜ静的クラスは一般的に悪いと言えますか?自分のPDOラッパーに静的クラスを使用しています...私にとってはうまくいくと思われます。私たちがそれらを避けなければならない特別な理由はありますか? – BenOfTheNorth

+0

@BenGriffiths、いくつかの理由。主な問題は*静的クラス*で多態性を使うことができないことです。メソッドの実行は、クラスの** name **に関連付けられています。また、これは本当にOOPではありません。静的クラスは実際にはショーのためだけに存在します。あなたが持っているのは、namespace-ish構造に束縛された関数のリストです。とにかく、主題を研究するだけです。多くの資料があります。より良い習慣を学びたいなら、[ここから始めてください](http://kore-nordmann.de/blog/0103_static_considered_harmful.html)。 –

+0

ありがとう、私はそれを調べます。静的を使用する私の個人的な理由は、クラス全体を宣言する必要がないか、他のオブジェクトに渡す必要がないためです。これは、定数オブジェクトの一種として役立ちます。私は自分のケースでは巨大なクラスは必要ありませんが、小さな静的なクラスにまとめておくと、それをより整理しやすく管理しやすくなります。 – BenOfTheNorth

0

持続的接続を内蔵しています:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true 
)); 

あなたは二度とSingletonパターンを使用していないことから始めることができExample #4 Persistent connections

+0

これは元の質問に答えることができない場合でも役に立ちます。多分コメントとして投稿する必要があります。答えはLogicException {}を継承します。あなたが欲しいと思っているならば、あなたは$ {== $ to};} catch(Points $ for){新しい回答( )またはdie($ for.this ');} ' –

+2

ここにコメディアンがあります。 –

関連する問題