За последние 24 часа нас посетили 48240 программистов и 13557 роботов. Сейчас ищут 2572 программиста ...

mysqli ооп singletone ?

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

  1. lamebot1

    lamebot1 Новичок

    С нами с:
    24 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    Доброго времени суток прошу не кидать тапком вопросов много,
    Началось все с изучения подключения к бд ооп методом... из чего вытек ряд проблем:
    1) необходимость каждый раз в методе вбивать логин
    из проблемы 1 вытек многократный совет реализовать через сингл тон.... перекопав интернет нашел след учебный вариант:
    Код (Text):
    1.     class Sql extends mysqli{
    2.  
    3.         private $db_host    ='localhost';
    4.         private $db_login   ='user';
    5.         private $db_password='pass';
    6.         private $db_table   ='table';
    7.  
    8.         // Здесь храним объект, из вне недоступно
    9.         // получаем только через статический метод
    10.         private static $instance;
    11.  
    12.         // Получаем объект
    13.         public static function getInstance(){
    14.             // Если еще не создан - создать
    15.             if (is_null(self::$instance)) {
    16.                 self::$instance = new self();
    17.             }
    18.             // Возвращаем готовый объект
    19.             return self::$instance;
    20.         }
    21.  
    22.         // Модификатор private - чтобы нельзя было создать еще один объект
    23.         // конструкцией new Sql();
    24.         private function __construct(){    //  <- Косяк почему то тут
    25.             parent::__construct($this->db_host, $this->db_login, $this->db_password, $this->db_table);
    26.  
    27.             if (mysqli_connect_error()) {
    28.                 die('Ошибка подключения (' . mysqli_connect_errno() . ') '
    29.                         . mysqli_connect_error());
    30.             }
    31.         }
    32.  
    33.    
    34.         // Модификатор private - чтобы нельзя было создать еще один объект
    35.         // конструкцией clone($db);
    36.         private function __clone(){}
    37.         // Модификатор private - чтобы нельзя было создать еще один объект
    38.         // конструкцией unserialize($db);
    39.         private function __wakeup(){}
    40.     }
    и все было бы здорово но мне не понятной причине при наследовании от mysqli выдает ошибку что конструктор должен быть публичным, прошу подробно на пальцах объяснить почему так происходит

    Код (Text):
    1. class ClassOne{
    2.  
    3.   public function __construct()
    4.     {
    5.         echo 'I\'m constructor ClassOne <br>';
    6.     }
    7.  
    8. }
    9.  
    10. class ClassTwo extends ClassOne{ //extends ClassOne
    11.  
    12.     private static $instance = NULL;
    13.  
    14.     public static function getInstance(){
    15.         if (self::$instance != NUll){
    16.             return self::$instance;
    17.  
    18.         }
    19.         return self::$instance = new self();
    20.  
    21.     }
    22.  
    23.  
    24.  
    25.     private function __construct()
    26.         {
    27.             echo 'I\'m constructor ClassTwo <br>';
    28.               parent:: __construct();
    29.  
    30.         }
    31. }
    32.  
    33. //$SingleTone = new ClassTwo();
    34.  
    35.  
    36. $SingleTone = ClassTwo::getInstance();

    Также след вопросы касательно mysqli:
    1) как вычитал из мануала и на сколько понял, смысл в том что открываем соединения с бд, проводим какие то манипуляции, и далее закрываем соединение с бд.
    можно ли как то в данном случае сделать закрытие автоматически (через дестрактор там) ?
    2) как проверить открыто или закрыто соединение ?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    public function __construct(){
     
  3. lamebot1

    lamebot1 Новичок

    С нами с:
    24 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    так если она публичной будет это разве сингл тон будет ?
    можно же тогда создать сколь угодно много объектов данного класса... или я не прав ?
     
  4. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Ты можешь не наследуя, в статичную, протектед переменную кинуть обьект mysqli и пользоваться наздоровье в синглтоне
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    public function __construct ()
    {
    parent::__construct ();​
    }
     
  6. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Так он ж синглтон мутить пытается
     
  7. lamebot1

    lamebot1 Новичок

    С нами с:
    24 авг 2017
    Сообщения:
    8
    Симпатии:
    0
    не очень понимаю что вы имеете в виду, можно пример ?
     
  8. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Ну твой синглтон ни от кого не наследуешь, как и инстанс, делаешь переменную приватную для обьекта mysqli, кидаешь ее туда, обьявляешь тогда же когда и в гетИнстанс создаётся экземпляр твоего синглтона. Ну и дальше дело вкусов.. Можешь сделать какой нибудь гетМускуль() который будет возвращать обьект mysqli. А так как это статичная переменная, всегда будет один обьекь бд. Ну и можешь писать что то вроде: гетМускуль()-->query()..
    --- Добавлено ---
    Вообще не ясно, зачем городить такие сложности. Можно же в define вытащить данные для коннекта. По мне так удобнее