Как реализовать singleton для PDO?

Прекрасно создавался класс по синглтон паттерну для mysqli, решил переписать для PDO:
class DB extends PDO
{
  const DB_HOST = 'localhost';
  const DB_LOGIN = 'root';
  const DB_PASSWORD = '';
  const DB_NAME = 'dbase';
  private static $_instance = NULL;
  
  private function __construct()
  {
      parent::__construct('mysql:host='.self::DB_HOST.';dbname='.self::DB_NAME, self::DB_LOGIN, self::DB_PASSWORD);
  }
  
  private function __clone()
  {
      
  }
  
  public static function getInstance()
  {
      if (is_null(self::$_instance)) {
          self::$_instance = new self;
      }
      return self::$_instance;
  }
}


Всё это дело выдаёт ошибку:
Fatal error: Access level to DB::__construct() must be public (as in class PDO)


Вопрос - нафига в PDO усложнили жизнь, не дав реализовать каноничный синглтон, и каким костылём его теперь реализовывать? Чтобы действительно нельзя было создать вторую копию объекта.
  • Вопрос задан
  • 534 просмотра
Пригласить эксперта
Ответы на вопрос 4
miraage
@miraage
Старый прогер
Зачем так усложнять себе жизнь, если это обычная обертка без кастомного функционала?
У вас ООП головного мозга.

function db()
{
  static $pdo;
  
  if ($pdo === null)
  {
    // Init pdo here
  }
  
  return $pdo;
}
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
https://github.com/colshrapnel/thebestpdowrapper
Хотя сейчас мне идея уже не нравится, и я хочу не оверлоадить стейтмент а добавить метод к основному классу.
Вот так примерно: phpfaq.ru/pdo_wrapper

перегрузить методы PDO, расширить функционал,

Имей в виду, что большинство твоих изменений будут либо бесполезны, либо вредны.
Как напишешь, пости сюда на ревью
Ответ написан
w999d
@w999d
Web-developer
class DB{
  const DB_HOST = 'localhost';
  const DB_LOGIN = 'root';
  const DB_PASSWORD = '';
  const DB_NAME = 'dbase';
  private static $_instance = NULL;
  private function __construct(){}
  private function __clone(){}
  public static function getInstance(){
      if (is_null(self::$_instance)) {
          self::$_instance = new PDO('mysql:host='.self::DB_HOST.';dbname='.self::DB_NAME, self::DB_LOGIN, self::DB_PASSWORD);
      }
      return self::$_instance;
  }
}
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
Никогда не пишите штуки вроде паролей доступа прямо в коде. Выносите где-то в конфигурацию, которая будет жить отдельно от системы контроля версий, а то получается потом, что выкладывают на GitHub со всеми паролями.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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