Это хороший код? Он выводит имя пользователя и возраст. Код не мой, просто изучаю его, по накидайте пожалуйста небольшие нормальные примеры. Только не надо там где машина заводится, едет и останавливается. PHP: <?php class Db { private $link; private $host = 'localhost'; private $user = 'root'; private $password = ''; private $database = 'oop'; private $table = 'users'; //Подключается к базе: public function __construct() { $this->link = mysqli_connect($this->host, $this->user, $this->password, $this->database ); } //Делает запрос к базе: public function get($id, $field) { $query = $this->createSelect($id, $field); $result = $this->makeQuery($query); //будет в виде ['age'=>25] return $result[$field]; //а тут достанем 25 } //Создает строку с запросом: private function createSelect($id, $field) { $table = $this->table; return "SELECT $field FROM $table WHERE id=$id"; } //Совершает запрос к базе: private function makeQuery($query) { $result = mysqli_query($this->link, $query); return mysqli_fetch_assoc($result); } } $bazaDan = new Db; echo $bazaDan->get('1', 'name'); echo '<br>'; class User { private $id; private $db; public function __construct($id) { $this->id = $id; //Создаем объект для работы с БД: $this->db = new Db; } public function getName() { return $this->db->get($this->id, 'name'); } public function getAge() { return $this->db->get($this->id, 'age'); } } $user = new User('1'); echo $user->getName(); echo '<br>'; echo $user->getAge(); ?>
У класса Db как минимум две проблемы: 1. Количество соединений с базой равно количеству экземпляров этого класса 2. К базе можно выполнить только простейший вариант запроса выборки данных и в результате получить значение одного поля.
Друг, я конечно в ооп слабоват, но там один экземпляр класса $link идет на вызов, а другие в аргументы mysqli_connect (кроме table)
Потому что static свойства и методы принадлежат классу, а не его экземплярам. Класс один - соединение с базой одно. Обращение self - обращение к классу, тогда как $this - обращение к экземпляру. $link - это не класс, а его свойство. И создается два экземпляра: один - просто в коде, второй внутри экземпляра класса User. PHP: $bazaDan = new Db; ... class User { ... public function __construct($id) { ... //Создаем объект для работы с БД: $this->db = new Db; } ... } $user = new User('1');
Там два отдельных, не связанных между собой класса - Db и User, и во втором ее нет и из нее туда ничего не попадет потому что это ооп.
@keren, вот тут про конструкторы, но там справа еще куча всего полезного. P.S.: "справа" - меню php.net, но ссылку исправили на php.ru
self, static и global это такой общий доступ, статические переменные еще сохраняют данные между вызовами, есть отрицательное мнение об этом.
@Maputo где по ссылке говорится что объект одного класса можно засунуть в конструктор другого класса? И я не имел в виду что link это класс, ты вначале употребил слова экземпляры класса, а я за тобой повторил, конечно это свойство класса, и вот это - $this->db = new Db; - объект одного класса внутри другого класса, я не в курсе что такое может быть, и ссылка на private $db; в классе User, я не представляю как это может запустить подключение в классе Db.
Вот кстати тут решение: https://php.ru/forum/threads/podkljuchenie-k-baze-dannyx-oop.58985/ PHP: class Books { private $mysqli; public function __construct(\mysqli $mysqli) { $this->mysqli = $mysqli; } public function otherMethod () { $this->mysqli->query("SELECT 1"); } } $mysqli = new DB_CONFIG(); $books = new Books($mysqli);
что же произойдет, если мы сделаем PHP: $user1 = new User(1); $user2 = new User(2); сколько раз будет вызвана функция mysqli_connect()?
@Dimon2x верно, но можно обойтись без статик-свойств в классе User и без аргумента в конструкторе, если класс DB будет Singleton. PHP: $this->db = DB::getInstance();
А вы понимаете разницу между обращением к классу и обращению к методу? И что будет если объект одного класса засунуть внутрь метода другого класса? Вы посмотрите внимательнее первый пост.
@keren конструктор (функция __construct()) выполняется при создании каждого нового экземпляра с помощью new. Уже была ссылка на то, как работают конструкторы.
Я знаю как работает конструктор, объект для конструктора в том классе User это $user = new User('1'); А там еще внутрь вставили левый $this->db = new Db;, вы думаете сервер это прочитает?
Ошибок в этом коде нет, это будет работать. --- Добавлено --- @keren о чем тут говорить, если так просто взять и проверить?) --- Добавлено --- @keren о чем тут говорить, если так просто взять и проверить?)
@keren, я Вам дал ссылку для того чтобы Вы еще раз посмотрели в какой момент используется конструктор. Каждый раз когда имя класса используется с оператором new - работает конструктор этого класса. Если объект базы создается внутри конструктора класса пользователя, то в этот же момент будет задействован код, находящийся внутри конструктора класса базы. Подобный код: PHP: $bazaDan = new Db; ... $user = new User('1'); создаст два экземпляра класса базы. А это значит, что код конструктора класса базы будет запущен дважды.
@Dimon2x, ООП требует понимания теории. https://www.ozon.ru/context/detail/id/33506422/ - про объекты в php лучше никто не написал
Потому что ты не понимаешь, что такое ООП! --- Добавлено --- Исходя из постов выше ты даже запаха ООП не чувствуешь!