これは古いことは知っていますが、Dr8kの答えはほとんどありませんでした。
コードの記述を検討しているときは、それが変更されると想定してください。これは、将来のある時点でそれがもたらす変更の種類を想定しているという意味ではなく、何らかの形の変更が行われるという意味です。
将来の変更の苦痛を軽減することを目標にします。グローバルは、単一の場所で管理するのが難しいため、危険です。将来、そのデータベース接続コンテキストを認識させたい場合はどうすればよいですか?5回使用するたびに閉じてから再度開くようにするにはどうすればよいですか。アプリをスケーリングするために、10個の接続のプールを使用することにした場合はどうなりますか?または、構成可能な接続数ですか?
シングルトンの工場は、あなたにその柔軟性を提供します。余分な複雑さをほとんど伴わずにセットアップし、同じ接続にアクセスするだけでは不十分です。その接続が後で簡単な方法で私に渡される方法を変更する機能を取得します。
単にシングルトンではなく、シングルトンファクトリと言っていることに注意してください。シングルトンとグローバルの間には、貴重な小さな違いがあります。そのため、シングルトン接続を使用する理由はありません。代わりに通常のグローバルを作成できるのに、なぜその設定に時間を費やすのでしょうか。
ファクトリが取得するのは、接続を取得する理由であり、取得する接続(または接続)を決定するための別の場所です。
例
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行のコード。これにより、不気味に似たようなものにリファクタリングする時間を節約できます。
最初のラウンドでは機能の実装を行っていないため、この「機能クリープ」は考慮しないことに注意してください。それは「FutureCreep」の境界線ですが、ある時点で、「今日の明日のためのコーディング」が常に悪いことであるという考えは私にとっては気になりません。