0

ですから、これは私が何年にもわたって理解することを意味してきたことです。いくつかの小さな(単一ファイル)アプリケーションをPDOに変換します。PDOを使用し、データベースに接続してクエリを実行できますが、すべて機能しています。

しかし、新しいPDOを初期化するたびに、実行する
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
必要もあります。たった1行ですが、いつかそこにさらに何かを追加する必要があるかもしれません。私には、その行を含めることができる方法でPDOクラスを拡張して、DB接続を1行で開始できるようにする方がよいように思われます。自分のクラスを作成すると、この段階で1行のコードを追加するだけでも、将来何かを追加することにした場合でも、将来にわたって利用できるようになります。

私はこのようなものを見つけました...

class myPDO extends PDO {
    public function __construct($dsn, $user=null, $pass=null, $options=null) {
        parent::__construct($dsn, $user, $pass, $options);
        $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
}

// THEN A SIMPLE 1 LINER TO CONNECT - USING TRY/CATCH AS WELL OF COURSE
$pdo_conn = new myPDO($cfg['pdo_dsn'], $cfg['pdo_user'], $cfg['pdo_pass'], $cfg['pdo_options']);

クラスを拡張するとき、コンストラクターを実際に再作成する必要はないと思います。コンストラクター関数を再作成せずにクラスに
統合する方法はありますか?$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

私はPHPのクラス構文を使い始めたばかりなので、これは誰かにとって本当に基本的な質問になりますが、同時に他のいくつかの質問にも答えます。

4

2 に答える 2

2

ここでPDOから拡張する必要はありません。必要なのは、PDOオブジェクトを作成するアプリケーションの中心的な場所です。その後、時間の経過とともに必要な変更を行い(たとえば、構成ファイル/システムの統合)、一元的に拡張できます。

1つは、そのためのクラスを作成することです。それを次のように呼びましょうPdoFactory

class PdoFactory
{
     /**
      * @return PDO
      */
     public function buildPdo() {
        $pdo = new PDO($dsn = 'xyz', $user = 'abc', $pass = '', $options  = '');
        if ($pdoException = true) {
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return $pdo;
     }
}

使用法:

$factory = new PdoFactory();
$pdo = $factory->buildPdo();

ご覧のとおり、これは非常に使いやすいです。PdoFactory関数を呼び出す場所とは別に、作成する場所を配置することもできますbuildPdo()

また、これにより、ここで2つの異なることを扱っていることがより明確になります。最初にPdoオブジェクト(独自のクラスにカプセル化)を作成し、データベースにアクセスするためだけのPdoオブジェクト自体を作成します。

これがお役に立てば幸いです。

于 2012-08-30T07:38:18.640 に答える
1

問題は、私が見ているように、特定のエラーレベルをアプリケーションにハードコーディングしていることです。開発中で、すべてが必要な場合はどうなりますか?特定のアプリケーションのレベルを変更したい場合はどうなりますか?事後に設定するパラメーターとして保持するか、サブクラス化することに熱心な場合は、コンストラクター引数としてエラーレベルを渡す方がはるかに良いでしょう。

于 2012-08-29T17:54:08.980 に答える