[解決済み] データベース接続はグローバルかシングルトンか?
質問
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行のコードで、この先何時間も何時間も不気味に似たものにリファクタリングする時間を節約できます。
最初のラウンドでどんな機能の実装も行っていないので、私はこれを "機能クリープとは考えていないことに注意してください。しかし、ある時点で、「今日、明日のためにコーディングする」という考え方は 常に という考え方は、私にとって納得のいくものではありません。
関連
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Androidでグローバル変数を宣言するには?
-
[解決済み] Swiftでdispatch_onceのシングルトンモデルを使う
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み] JavaScriptでシングルトンを実装する最もシンプルでクリーンな方法
-
[解決済み】C++ シングルトンデザインパターン
-
[解決済み】Singleton。どのように使用するべきか
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み] SAJAXは死んだか?何を置き換えるべきか?
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: バインドされた変数の数が102行目のトークンの数と一致しない [終了]
-
[解決済み】stdClassクラスのオブジェクトが文字列に変換されない。
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み】PDOException SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリがありません。
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み] PHP 未定義関数への呼び出し