2016-06-18 8 views
0

PHPでPDOを使用するのが初めてで、サンプルコードを見直した後、DB接続を効率的に処理するにはどうすればいいのか疑問に思っていました。PHP PDO DB接続の確立

dbconnector.phpに次のような接続があります。

try { 
    $db = new PDO("mysql:host=$servername;dbname=$dbname", $appusername, $apppassword); 
    // Set the PDO error mode to exception 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    echo "Connected Successfully"; 
} catch (PDOException $e) { 
    echo "Connection failed: " . $e->getMessage(); 
} 

ので、私は、データをフェッチする必要があるすべての関数にコピー立ち往生していないよ、各クラスでこのコードを活用するための最良の方法は何ですか?:エコーは単なるテストコードですか私はPDOを拡張し、必要に応じてdbオブジェクトを作成することを考えましたが、PDOがすでにオブジェクト指向であるため、そうしてしまうようなポストや記事を読んでいました。

+0

あなたの質問はあまり意味がありません。あなたはクラスで作業していますが、簡単なコードを繰り返さないようにする方法はありませんか?それは非常に奇妙です。私は言う:最初からPHPの本を読んで開始する。 –

+1

[あなたはそれらを報告するためにエラーを捕まえてはいけません](https://phpdelusions.net/pdo#errors) –

答えて

0

私は、これは完全に理解新人のミスであるPDO

を拡張について考えました。しかし、これは、少なくともSOLIDという2つのルール(SRPLSP)に違反しています。

原則責任PDOを拡張することによって、新しいクラスは新しいクラスが何をしようとしているかにデータアクセスを結合しました。

リスコフの置換原則PDOを拡張することで、あなたはまた、新しいクラスになっていないPDOの拡大版を、宣言しています。 PDOfunction foo(PDO $pdo))の型ヒントを持つ関数は、あなたの新しいクラスを引数として受け入れます - 実際にはそうではありません。

開封の原則でもケースが考えられると思いますが、これは十分に考えることができます。

クラスがデータベース接続全体をクラスに挿入するのではなく、そのデータベースの出力でクラスを操作する方が意味があるかもしれません。つまり、新しいクラスにデータベース接続を使用させるのではなく、だけをクラスに必要なデータだけ渡します。これは最も簡単な実装です。

つまり、データベース接続をクラスに挿入する必要があるのは完全に良い理由があります。ただし、これはdependency injectionで行う必要があります。ここでは簡単な例を示します。

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

    public function doTheThing(){ 
     $this->PDO->query(/* do whatever */); 
     // ... 
    } 
} 

$pdo = new PDO(/* whatever */); 
$foo = new Foo($pdo); 

この方法では、カスタム構築されたPDOインスタンスに基づいて新しいクラスをインスタンス化し、異なるPDOオブジェクトと異なるデータベースにアクセスすることができます。

これ以上ステップを進める必要がある場合は、「データアクセス」インターフェイスを作成し、それを実装するオブジェクトを作成し、インターフェイスのタイプヒントを作成することができます。しかし、ちょうどPDOインスタンスを注入することは正しい方向へのすばらしい第一歩です。