За последние 24 часа нас посетили 34084 программиста и 1319 роботов. Сейчас ищут 1026 программистов ...

function __construct() выскажитесь пожалуйста

Тема в разделе "PHP для новичков", создана пользователем AlexProg, 3 мар 2018.

Метки:
  1. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Всем привет!

    Выскажите пожалуйста свое мнение по поводу __construct()
    Нужно вот так делать:

    PHP:
    1.     function __construct()
    2.     {
    3.         $this->db = new db(config::$Host, config::$User, config::$Pass, config::$Base);
    4.     }
    Или вот так:

    PHP:
    1.     function __construct($db)
    2.     {
    3.         $this->db =$db;
    4.     }
    Ну и обоснуйте ответ свой.
    P.S. Как делать правильно!? :)
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Второй вариант и через инстанс. А потом создать еще один класс в котором уже будешь работать с текущим.
    config::$Host - вот так не пиши.
    Или \App\Config::$host (Класс с большой буквы, свойство с маленькой а константа все буквы большие)
    или через хелпер config()->host
     
    #2 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018
    AlexProg нравится это.
  3. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Ухтыжептв**мать! Можно пример!? :)
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Создаешь класс в котором у тебя будет открываться соединение с базой данной. Делаешь его синглтоном что бы не создавать много разных соединений. (Ты же явно не в одном файле будешь обращаться к бд.) Создаешь свойство которое будет создавать это соединение а дальше в нужном классе его вызываешь. Плюс нужен будет еще один метод который будет вызываться в самом конце всего кода и закрывать соединение.
     
    AlexProg нравится это.
  5. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Это помимо класса для работы с БД? Там есть уже соединение.
     
  6. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Конечно, нужно же 5 оберток :)
    Что там обсуждать как подключаться, лучше подумать как подготавливать запросы.
     
    AlexProg и TeslaFeo нравится это.
  7. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну если db это уже обертка тогда __construct совсем не нужен. Прям в методе и вызывать. Только зачем тогда каждый раз передавать конфиги? Лучше уж имя соединения передавать и одно дефолтное.
     
    AlexProg нравится это.
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    давайте захерачим иерархию классов для хранения параметров соединения с бд.
    одного статического класса явно мало...
     
    AlexProg нравится это.
  9. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Да, полный класс для работы PDO.
    Как тогда лучше? В нем инстанс?
     
  10. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    А есть что то вроде DB::connection()->close()? Или он сам память очищает? Ну если фреймворк то там явно все продумано. Просто в методе вызывай.
    PHP:
    1. $conn = db(config::$Host, config::$User, config::$Pass, config::$Base);
    2. $conn = db();
    3. $conn = db('mysql')
    4. //ну если это не значительно тогда зачем вообще нужно ооп процедурный код быстрее
     
  11. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Есть деструктор. Там close в нем.

    Еще есть:

    PHP:
    1. private function Connect($host, $user, $pass, $base){
    В ней передается $this->con и везде потом используется.

    Парни, вы скажите как нужно или лучше я переделаю.
     
  12. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну если $this->con для сокращения, тогда логичнее сделать обертку. А если делать ебертку тогда и добавить синглтон не проблема
    class MyClass { public finction con() { return db(config::$Host, config::$User, config::$Pass, config::$Base)} }
    и какой нибудь глобальный хеллпер
    function db(
    return MyClass::_instance()->con;
    )
    а дальше пользуешь как db();
     
    AlexProg нравится это.
  13. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Без разницы особо, но по феншую, внедрение зависимостей (DI), второй вариант в первом посте лучше :)
     
    AlexProg нравится это.
  14. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Это новый класс?

    Как использовать класс config (много настроек для всего сайта, часто используется) и класс function (в нем все необходимые функции, првоерки и т.д. так же часто используется)
    Даже бывает что в классе функции вызываются БД и config. В общем сочетания разные.
     
  15. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну не знаю. Как по мне или обертка или прям в каждом методе вызывать конструкт через this как то странно
     
  16. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Сделал так:

    PHP:
    1. static $inst = null;
    2. private $con = false;
    3.  
    4. public function __construct(){
    5.         $this->Connect(config::$Host, config::$User, config::$Pass, config::$Base);
    6.         $this->query("SET NAMES 'utf8'");
    7.         $this->query("SET CHARACTER SET 'utf8'");
    8.     }
    9.  
    10. private function Connect($host, $user, $pass, $base){
    11.         $this->con = подключение...
    12. }
    13.  
    14. static function getInstance()
    15.     {
    16.         if(self::$inst == null)
    17.         {
    18.             self::$inst = new DB();
    19.         }
    20.         return self::$inst;
    21.     }
    Использую так:

    PHP:
    1. $db = DB::getInstance();
    2. var_dump($db->Stats());
    Вопрос: Правильно? :)
     
  17. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Нет. Но зато с ООП разберешься)
    как минимум $this->con= подключение... работать не будет. не знаю почему но присваивать значения не статическому свойству php не умеет. Только self::$con где $con public static
    Ну и остальная логика не понятная
     
    #17 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018
  18. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    PHP:
    1.     protected static $_instance;
    2.     public static function _instance() {
    3.         return self::$_instance = self::$_instance ?? new self();
    4.     }
    5.  
    6.     protected static $db;
    7.     public static function db() {
    8.         return self::_instance()->db = self::_instance()->db ?? new db(config::$Host, config::$User, config::$Pass, config::$Base);
    9.     }
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    У всех присваивает, у тебя не умеет :)
    --- Добавлено ---
    @webog, погугли паттерн Registry
     
  20. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    А вот не нада.. У всех не умеет. Не возможно не статическому свойству с метода через this что то присвоить. Только так как я написал при условии сингтона.
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    И как же я пять лет программирую на PHP, и не заметил...

    https://ideone.com/LXScDg - представляешь, работает
     
  22. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    А вот так нет. Давай пример с сингтоном через this. Сайт прикольный.
    PHP:
    1. class Helper
    2. {
    3.     protected static $_instance;
    4.     public static function _instance() {
    5.         if(is_null(self::$_instance)) self::$_instance = new self();
    6.         return self::$_instance;
    7.     }
    8.     public $title = 'title';
    9.     public function meta() {
    10.         $this->title = 'new title';
    11.         return self::_instance();
    12.     }
    13. }
     
    #22 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    https://ideone.com/BwjXXd

    На :)
    --- Добавлено ---
    Прежде чем думать, что php разрабатывали идиоты, и уже 20 лет им пользуются тоже идиоты, которые не знают, как классы должны работать, надо всё-таки у себя поискать ошибку
     
  24. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Более практический вариант:
    PHP:
    1.   public function meta() {
    2.            return $this->title = 'new title';
    3.             return self::$_instance;
    4.         }
    5.    
    6.   var_export(Helper::_instance()->meta()); //'new title'
     
  25. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    тогда вызывать не удобно Helper::_instance()->meta() вместо Helper::meta() и присваивать Helper::_instance()->meta()->title = '' хотя логично присваивание было до вызова инстанс.
    Мне мой вариант больше нравится
    PHP:
    1.     public static function meta() {
    2.         self::_instance()->title = self::_instance()->title ?? trans('trans.app_name');
    3.         return self::_instance();
    4.     }
    Вообщим ООП в PHP запутывает... А на счет умных людей. Реализация ООП в ПХП самая страшная из всех что я видел. И utf8 бесит и работу с массивами как с объектами нормально не реализовали. Вечно что то во что то конвертируется..
     
    #25 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018