Доброго времени суток прошу не кидать тапком вопросов много, Началось все с изучения подключения к бд ооп методом... из чего вытек ряд проблем: 1) необходимость каждый раз в методе вбивать логин из проблемы 1 вытек многократный совет реализовать через сингл тон.... перекопав интернет нашел след учебный вариант: Спойлер: Учебный вариант подключения singleton Код (Text): class Sql extends mysqli{ private $db_host ='localhost'; private $db_login ='user'; private $db_password='pass'; private $db_table ='table'; // Здесь храним объект, из вне недоступно // получаем только через статический метод private static $instance; // Получаем объект public static function getInstance(){ // Если еще не создан - создать if (is_null(self::$instance)) { self::$instance = new self(); } // Возвращаем готовый объект return self::$instance; } // Модификатор private - чтобы нельзя было создать еще один объект // конструкцией new Sql(); private function __construct(){ // <- Косяк почему то тут parent::__construct($this->db_host, $this->db_login, $this->db_password, $this->db_table); if (mysqli_connect_error()) { die('Ошибка подключения (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); } } // Модификатор private - чтобы нельзя было создать еще один объект // конструкцией clone($db); private function __clone(){} // Модификатор private - чтобы нельзя было создать еще один объект // конструкцией unserialize($db); private function __wakeup(){} } и все было бы здорово но мне не понятной причине при наследовании от mysqli выдает ошибку что конструктор должен быть публичным, прошу подробно на пальцах объяснить почему так происходит Спойлер: Тестовый код при наследовании аналогичная ошибка Код (Text): class ClassOne{ public function __construct() { echo 'I\'m constructor ClassOne <br>'; } } class ClassTwo extends ClassOne{ //extends ClassOne private static $instance = NULL; public static function getInstance(){ if (self::$instance != NUll){ return self::$instance; } return self::$instance = new self(); } private function __construct() { echo 'I\'m constructor ClassTwo <br>'; parent:: __construct(); } } //$SingleTone = new ClassTwo(); $SingleTone = ClassTwo::getInstance(); Также след вопросы касательно mysqli: 1) как вычитал из мануала и на сколько понял, смысл в том что открываем соединения с бд, проводим какие то манипуляции, и далее закрываем соединение с бд. можно ли как то в данном случае сделать закрытие автоматически (через дестрактор там) ? 2) как проверить открыто или закрыто соединение ?
так если она публичной будет это разве сингл тон будет ? можно же тогда создать сколь угодно много объектов данного класса... или я не прав ?
Ты можешь не наследуя, в статичную, протектед переменную кинуть обьект mysqli и пользоваться наздоровье в синглтоне
Ну твой синглтон ни от кого не наследуешь, как и инстанс, делаешь переменную приватную для обьекта mysqli, кидаешь ее туда, обьявляешь тогда же когда и в гетИнстанс создаётся экземпляр твоего синглтона. Ну и дальше дело вкусов.. Можешь сделать какой нибудь гетМускуль() который будет возвращать обьект mysqli. А так как это статичная переменная, всегда будет один обьекь бд. Ну и можешь писать что то вроде: гетМускуль()-->query().. --- Добавлено --- Вообще не ясно, зачем городить такие сложности. Можно же в define вытащить данные для коннекта. По мне так удобнее