За последние 24 часа нас посетили 64273 программиста и 1753 робота. Сейчас ищут 1794 программиста ...

сделать singleton

Тема в разделе "PHP для новичков", создана пользователем artemka, 28 окт 2017.

  1. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    Есть класс с методом подключения к бд.
    PHP:
    1. <?php
    2.  
    3. class Db
    4. {
    5.    
    6.     public static function getConnection()
    7.     {
    8.         // Получаем параметры подключения из файла
    9.         $paramsPath = ROOT . '/config/db_params.php';
    10.         $params = include($paramsPath);
    11.  
    12.         // Устанавливаем соединение
    13.         $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
    14.         $db = new PDO($dsn, $params['user'], $params['password']);
    15.  
    16.         // Задаем кодировку
    17.         $db->exec("set names utf8");
    18.  
    19.         return $db;
    20.     }
    21.  
    22. }
    23.  
    24. // и файл db_params
    25.  
    26.  
    27. <?php
    28.  
    29. return array(
    30.     'host' => 'localhost',
    31.     'dbname' => 'db',
    32.     'user' => 'root',
    33.     'password' => '',
    34. );

    как из этого сделать singleton?
    --- Добавлено ---
    я сделал так:

    PHP:
    1. <?php
    2.  
    3. class Db
    4. {
    5.     private static $_instance;
    6.  
    7.     public static function getInstance() {
    8.         if(!self::$_instance) {
    9.             self::$_instance = new self();
    10.         }
    11.         return self::$_instance;
    12.     }
    13.  
    14.  
    15.     public static function getConnection()
    16.     {
    17.         // Получаем параметры подключения из файла
    18.         $paramsPath = ROOT . '/config/db_params.php';
    19.         $params = include($paramsPath);
    20.  
    21.         // Устанавливаем соединение
    22.         $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
    23.         $db = new PDO($dsn, $params['user'], $params['password']);
    24.  
    25.         // Задаем кодировку
    26.         $db->exec("set names utf8");
    27.  
    28.         return $db;
    29.     }
    30.  
    31. }
    а в моделе уже делаю:

    PHP:
    1. // Возвращает список новостей
    2.     public static function getNewsList()
    3.     {
    4.         $db2 = Db::getInstance();
    5.         $db = $db2->getConnection();
    6.  
    7.  
    8.         // Соединение с БД
    9.         //$db = Db::getConnection();
    10.  
    11.         // Получение и возврат результатов
    12.         $result = $db->query('SELECT * FROM news ORDER BY id DESC');
    13.         $productsList = array();
    14.         $i = 0;
    15.         while ($row = $result->fetch()) {
    16.             $productsList[$i]['id'] = $row['id'];
    17.             $productsList[$i]['title'] = $row['title'];
    18.             $productsList[$i]['text'] = $row['text'];
    19.             $i++;
    20.         }
    21.         return $productsList;
    22.     }
    вроде работает. это правильно?
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    по идее singlton должен быть с конструктором.. что бы в момент создания класса проверялось есть ли такой экземпляр или нет..
     
  3. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    пытался сделать, не вышло. вы можете написать и показать как?
     
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    а метод getConnection должен быть приватным что бы никто его не вызвал... а то помощью него можно нафигачить подключений..
     
  5. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    вот как то так наверно...
    PHP:
    1. class Db {
    2.    
    3.     private static $db = null;
    4.    
    5.     static public function getInstance() {
    6.         if(is_null(self::$db)){
    7.            // Получаем параметры подключения из файла
    8.             $paramsPath = ROOT . '/config/db_params.php';
    9.             $params = include($paramsPath);
    10.    
    11.             // Устанавливаем соединение
    12.             $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
    13.             self::$db = new PDO($dsn, $params['user'], $params['password']);
    14.    
    15.             // Задаем кодировку
    16.             self::$db->exec("set names utf8");
    17.         }
    18.         return self::$db;
    19.     }
    20.  
    21.     private function __construct() {}
    22.     protected function __clone() {}
    23.    
    24. }
     
  6. artemka

    artemka Новичок

    С нами с:
    18 авг 2017
    Сообщения:
    56
    Симпатии:
    4
    спасибо