developer's diary

最近はc#のエントリが多いです

似非Singltonな関数でデータベースのコネクションを1つだけにする

オブジェクトじゃないんのでSingltonでも無いんだろうけども。。。
PHPで何度も同じDBをオープンしないようにするコツみたいなものでしょうか。

本当のSingltonは↓みたいな方法で実現できます。
PDOでSingletonを実現しよう - @blog.justoneplanet.info

DBのコネクション取得を関数にした状態。

<?php
function getDB(){
	return new PDO('sqlite:test.sqlite', "", "");
}

$a = getDB();
$b = getDB();

var_dump($a);//object(PDO)#1 (0) {}→コネクション番号が#1
var_dump($b);//object(PDO)#2 (0) {}→コネクション番号が#2(新たなコネクションになっている)

コネクション番号は*1

DBのコネクション取得の関数を似非Singlton化

<?php
function getDB(){
	if(!isset($GLOBALS["getDB"])){
		$GLOBALS["getDB"]=new PDO('sqlite:test.sqlite', "", "");
	}
	return $GLOBALS["getDB"];
}

$a = getDB();
$b = getDB();

var_dump($a);//object(PDO)#1 (0) {}→コネクション番号が#1
var_dump($b);//object(PDO)#1 (0) {}→コネクション番号が#1(コネクションが1つだけしか無い)


デメリットは$GLOBALS["getDB"]をどこからでも書き換えてしまえる事でしょうか。
本当のSingltonならばクラスのprivateな領域に隠してあるので外から書き換えることができません。

*1:勝手に名前をつけました。