Задать вопрос
@kostcher

Правильность использования синглтона при работе с бд?

Доброго времени суток.

Подскажите пожалуйста, правильно ли я применяю паттерн синглтона для реализации подключения к бд?

<?
class Db
{
    private static $instance;
	private $DBH;
	
    private function __construct()
    {
    	include("app/config/config.php");
		if($this->DBH = new PDO("mysql:host=". HOST .";dbname=". DBNAME , USER , PASS))
		{
			$this->DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
			$this->DBH->prepare("set character_set_client='cp1251'")->execute();
			$this->DBH->prepare("set character_set_results='cp1251'")->execute();
			$this->DBH->prepare("set collation_connection='cp1251_general_ci'")->execute();               	
        }
        else
        {
        	// нет подключения к БД
        	$this->DBH = false;
        }   
    }
	
	 private function __clone() 
	 {
	 	 //запрещаем клонирование объекта модификатором private
     }
        
     private function __wakeup()
     {
     	//запрещаем клонирование объекта модификатором private
     }
    
    public static function getInstance(){ // реазилация синглтона
        if(is_null(self::$instance)){ // если приватная статическая переменная пустая,
            self::$instance = new Db; //то обращаемся к текущему классу
        }
        
        return self::$instance;
    }
}
?>
  • Вопрос задан
  • 579 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@krypt3r
1. Фанат short_open_tag детектед. Избавляйтесь от этой привычки.
2. Инклуд вынесите в начало скрипта.
3.
if($this->DBH = new PDO(...)) {
//...
} else {
//...
}

С веществами завязывайте и начните использовать try/catch с PDOException
4.
self::$instance = new Db;
Обычно пишут new self() или new static()
Ответ написан
Комментировать
if( ! isset(self::$instance)){
  self::$instance = new Db; 
}

А как же другие бд, кроме mysql?
Ответ написан
Комментировать
VladimirAndreev
@VladimirAndreev
php web dev
удачного написания unit-тестов под тот синглтон ))

лучше уж Dependency injector'а использовать... Его можно и пересозданию инстансов научить, например, если используется коннект к более чем одной бд
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы