1. ホーム
  2. php

[解決済み] データベース接続はグローバルかシングルトンか?

2023-08-16 05:32:49

質問

PHPでデータベース接続にglobalではなくsingletonを使用する利点は何ですか?グローバルではなくシングルトンを使用すると、コードが不必要に複雑になる気がします。

グローバルを使ったコード

$conn = new PDO(...);

function getSomething()
{
    global $conn;
    .
    .
    .
}

シングルトンを使ったコード

class DB_Instance
{
    private static $db;

    public static function getDBO()
    {
        if (!self::$db)
            self::$db = new PDO(...);

        return self::$db;
    }
}

function getSomething()
{
    $conn = DB_Instance::getDBO();
    .
    .
    .
}

グローバルまたはシングルトン以外のデータベース接続の初期化方法があれば、それについて言及し、グローバルまたはシングルトンに勝る利点を記述してください。

どのように解決するのですか?

古い話ですが、Dr8kさんの回答は ほとんど であった。

あなたがコードの一部を書くことを検討しているとき、それが変更されることを想定してください。それは、将来のある時点で、そのコードに掲げられる変更の種類を想定しているという意味ではなく、何らかの変更が行われることを想定しているという意味です。

将来的に変更を加える際の苦痛を軽減することを目標にする:グローバルは一カ所で管理するのが難しいので危険です。将来、そのデータベース接続をコンテキストを認識するようにしたい場合はどうすればよいでしょうか。また、5回使用するたびに、接続を閉じて開き直すようにしたらどうでしょう。アプリケーションのスケーリングのために、10個の接続プールを使用することに決めたらどうでしょう?または、接続の数を設定することはできますか?

A シングルトンファクトリー はその柔軟性を与えてくれます。私は余分な複雑さをほとんど持たずにそれをセットアップし、同じ接続にアクセスする以上のものを得ます。その接続が後で私に渡される方法を、簡単な方法で変更する能力を得ます。

私が言う シングルトン ファクトリ としていますが、単に シングルトン . シングルトンとグローバルの間には、ほとんど違いがありません。そのため、シングルトン接続を持つ理由はありません。代わりに通常のグローバルを作成できるのに、なぜその設定に時間を費やす必要があるのでしょうか?

ファクトリーがあなたにもたらすものは、コネクションを取得する理由と、どのコネクション(接続)を取得するかを決めるための別の場所です。

class ConnectionFactory
{
    private static $factory;
    private $db;

    public static function getFactory()
    {
        if (!self::$factory)
            self::$factory = new ConnectionFactory(...);
        return self::$factory;
    }

    public function getConnection() {
        if (!$this->db)
            $this->db = new PDO(...);
        return $this->db;
    }
}

function getSomething()
{
    $conn = ConnectionFactory::getFactory()->getConnection();
    .
    .
    .
}

それから6ヶ月後、あなたのアプリが超有名になり、ダグやスラッシュドットで取り上げられ、単一の接続以上のものが必要だと判断したとき、あなたは getConnection() メソッドにプーリングを実装するだけでいいのです。あるいは、SQL ロギングを実装したラッパーが欲しいと思ったら、 PDO のサブクラスを渡せばいいのです。あるいは、起動のたびに新しい接続が必要だと判断した場合は、 そのようにすることができます。硬直的ではなく、柔軟なのです。

中括弧を含む16行のコードで、この先何時間も何時間も不気味に似たものにリファクタリングする時間を節約できます。

最初のラウンドでどんな機能の実装も行っていないので、私はこれを "機能クリープとは考えていないことに注意してください。しかし、ある時点で、「今日、明日のためにコーディングする」という考え方は 常に という考え方は、私にとって納得のいくものではありません。