Всем привет! Выскажите пожалуйста свое мнение по поводу __construct() Нужно вот так делать: PHP: function __construct() { $this->db = new db(config::$Host, config::$User, config::$Pass, config::$Base); } Или вот так: PHP: function __construct($db) { $this->db =$db; } Ну и обоснуйте ответ свой. P.S. Как делать правильно!?
Второй вариант и через инстанс. А потом создать еще один класс в котором уже будешь работать с текущим. config::$Host - вот так не пиши. Или \App\Config::$host (Класс с большой буквы, свойство с маленькой а константа все буквы большие) или через хелпер config()->host
Создаешь класс в котором у тебя будет открываться соединение с базой данной. Делаешь его синглтоном что бы не создавать много разных соединений. (Ты же явно не в одном файле будешь обращаться к бд.) Создаешь свойство которое будет создавать это соединение а дальше в нужном классе его вызываешь. Плюс нужен будет еще один метод который будет вызываться в самом конце всего кода и закрывать соединение.
Конечно, нужно же 5 оберток Что там обсуждать как подключаться, лучше подумать как подготавливать запросы.
Ну если db это уже обертка тогда __construct совсем не нужен. Прям в методе и вызывать. Только зачем тогда каждый раз передавать конфиги? Лучше уж имя соединения передавать и одно дефолтное.
давайте захерачим иерархию классов для хранения параметров соединения с бд. одного статического класса явно мало...
А есть что то вроде DB::connection()->close()? Или он сам память очищает? Ну если фреймворк то там явно все продумано. Просто в методе вызывай. PHP: $conn = db(config::$Host, config::$User, config::$Pass, config::$Base); $conn = db(); $conn = db('mysql') //ну если это не значительно тогда зачем вообще нужно ооп процедурный код быстрее
Есть деструктор. Там close в нем. Еще есть: PHP: private function Connect($host, $user, $pass, $base){ В ней передается $this->con и везде потом используется. Парни, вы скажите как нужно или лучше я переделаю.
Ну если $this->con для сокращения, тогда логичнее сделать обертку. А если делать ебертку тогда и добавить синглтон не проблема class MyClass { public finction con() { return db(config::$Host, config::$User, config::$Pass, config::$Base)} } и какой нибудь глобальный хеллпер function db( return MyClass::_instance()->con; ) а дальше пользуешь как db();
Это новый класс? Как использовать класс config (много настроек для всего сайта, часто используется) и класс function (в нем все необходимые функции, првоерки и т.д. так же часто используется) Даже бывает что в классе функции вызываются БД и config. В общем сочетания разные.
Ну не знаю. Как по мне или обертка или прям в каждом методе вызывать конструкт через this как то странно
Сделал так: PHP: static $inst = null; private $con = false; public function __construct(){ $this->Connect(config::$Host, config::$User, config::$Pass, config::$Base); $this->query("SET NAMES 'utf8'"); $this->query("SET CHARACTER SET 'utf8'"); } private function Connect($host, $user, $pass, $base){ $this->con = подключение... } static function getInstance() { if(self::$inst == null) { self::$inst = new DB(); } return self::$inst; } Использую так: PHP: $db = DB::getInstance(); var_dump($db->Stats()); Вопрос: Правильно?
Нет. Но зато с ООП разберешься) как минимум $this->con= подключение... работать не будет. не знаю почему но присваивать значения не статическому свойству php не умеет. Только self::$con где $con public static Ну и остальная логика не понятная
PHP: protected static $_instance; public static function _instance() { return self::$_instance = self::$_instance ?? new self(); } protected static $db; public static function db() { return self::_instance()->db = self::_instance()->db ?? new db(config::$Host, config::$User, config::$Pass, config::$Base); }
А вот не нада.. У всех не умеет. Не возможно не статическому свойству с метода через this что то присвоить. Только так как я написал при условии сингтона.
И как же я пять лет программирую на PHP, и не заметил... https://ideone.com/LXScDg - представляешь, работает
А вот так нет. Давай пример с сингтоном через this. Сайт прикольный. PHP: class Helper { protected static $_instance; public static function _instance() { if(is_null(self::$_instance)) self::$_instance = new self(); return self::$_instance; } public $title = 'title'; public function meta() { $this->title = 'new title'; return self::_instance(); } }
https://ideone.com/BwjXXd На --- Добавлено --- Прежде чем думать, что php разрабатывали идиоты, и уже 20 лет им пользуются тоже идиоты, которые не знают, как классы должны работать, надо всё-таки у себя поискать ошибку
Более практический вариант: PHP: public function meta() { return $this->title = 'new title'; return self::$_instance; } var_export(Helper::_instance()->meta()); //'new title'
тогда вызывать не удобно Helper::_instance()->meta() вместо Helper::meta() и присваивать Helper::_instance()->meta()->title = '' хотя логично присваивание было до вызова инстанс. Мне мой вариант больше нравится PHP: public static function meta() { self::_instance()->title = self::_instance()->title ?? trans('trans.app_name'); return self::_instance(); } Вообщим ООП в PHP запутывает... А на счет умных людей. Реализация ООП в ПХП самая страшная из всех что я видел. И utf8 бесит и работу с массивами как с объектами нормально не реализовали. Вечно что то во что то конвертируется..