<MyRusakov.ru />

Профессиональная Web-разработка. Дизайн, код и автоматизация

Профессиональная Web-разработка. Дизайн, код и автоматизация

Это очень подробный курс из разряда "всё включено". Разбираются следующие темы: HTML, CSS, SCSS, JavaScript, PHP, SQL, Laravel, Nginx, PostCSS, npm, Vite, Vitest, Composer, PHPUnit, Prettier, Stylelint, ESLint, Pint, Larastan, Git, Agile, Scrum, Docker, Supervisord, Figma, Stitch AI, Confluence, Jira.

Рассчитан и на новичков, и на тех, кто уже знаком с основами, но хочет освоить полный цикл разработки.

Помимо самой теории, Вы увидите пример создания Web-проекта на 20 000 строк кода: от идеи и документации на Confluence через планирование на Jira, fullstack-разработку до деплоя на VPS.

Помимо уроков, курс содержит упражнения для закрепления знаний и финальное тестирование. А ещё Вы получите 5 полноценных Бонусных курсов: «GitLab под ключ», «Вёрстка сайта с нуля 2.0», «JavaScript с Нуля до Гуру 2.0», «PHP и MySQL с Нуля до Гуру 3.0» и «Laravel от А до Я».

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Форум сайта MyRusakov.ru

Создание объекта в классе БД
14.04.2012 23:01:13 Создание объекта в классе БД Сообщение #1
brussens

brussens

Мега-мастер

Мега-мастер

Дата регистрации:
11.10.2011 22:50:07

Сообщений: 438

Михаил, вот есть класс работы с БД
<?php
class DB {
private static $msqlicnct;
private function __construct() {
self::$msqlicnct = new Mysqli('localhost', 'root', '', 'beatzone');
return self::$msqlicnct;
}
public static function select() {
new DB();
$b = self::$msqlicnct->query("SELECT * FROM users WHERE id = '2'"->fetch_assoc();
print_r($b);
}
}
DB::select();
?>

класс основан на синглтоне, только вот хотелось бы new DB(); не дублировать в каждом новом методе класса, как его можно создавать один раз? Заранее спасибО)
Профиль
15.04.2012 13:48:47 Создание объекта в классе БД Сообщение #2
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Это какой-то испорченный singleton. Надо создать всего 1 статический метод, который создаёт новый объект и записывает в поле, либо если он уже существует возвращает его из поля. Все остальные методы должны быть нестатическими. Вызывали метод, появился объект, а дальше к нему применяете все необходимые методы.
Профиль
15.04.2012 15:29:36 Создание объекта в классе БД Сообщение #3
brussens

brussens

Мега-мастер

Мега-мастер

Дата регистрации:
11.10.2011 22:50:07

Сообщений: 438

Ведь по сути то по синглтону конструктор должен быть private, а статичный метод его создаёт, так ведь? Как тогда обратиться к статическому свойству класса? Ведь если конструктор привэйт, то нельзя создавать объект напрямую
Профиль
15.04.2012 15:30:58 Создание объекта в классе БД Сообщение #4
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

К нему надо обратиться только 1 раз в методе, создающем объект. Все остальные методы (уже нестатические) к данному полю вообще не должны обращаться.
Профиль
15.04.2012 15:52:47 Создание объекта в классе БД Сообщение #5
brussens

brussens

Мега-мастер

Мега-мастер

Дата регистрации:
11.10.2011 22:50:07

Сообщений: 438

Михаил, по вашему совету исправил ошибки, только вот как тогда обращаться уже непосредственно к самому объекту Mysqli, для выполнения query()?
Через конструкцию в методе insertos() не получается, пишут ошибку наличия метода.
Вот исправленный кодclass DB {
private static $msqlicnct;
private function __construct() {
new Mysqli('localhost', 'root', '', 'beatzone');
}
public static function select() {
if ( is_null(self::$msqlicnct) ) {
self::$msqlicnct = new DB();
}
return self::$msqlicnct;
}
public function insertos() {
$b = self::select();
$b->query("SELECT * FROM users WHERE id = '2'"->fetch_assoc();
echo $b['name'] . " " . $b['secondname'];
}
}
DB::select()->insertos();
Профиль
15.04.2012 16:33:16 Создание объекта в классе БД Сообщение #6
brussens

brussens

Мега-мастер

Мега-мастер

Дата регистрации:
11.10.2011 22:50:07

Сообщений: 438

Михаил, посидел, потупил, вот вроде понял, всё работает, скажите, какие замечания есть?
class DB {
private static $msqlicnct = NULL;
private function __construct() {
$this->db = new Mysqli('localhost', 'root', '', 'beatzone');
}
private function __clone() {}
private function __wakeup() {}
public static function select() {
if ( is_null(self::$msqlicnct) ) {
self::$msqlicnct = new DB();
}
return self::$msqlicnct;
}
public function insertos() {
$b = $this->db->query("SELECT * FROM users WHERE id = '2'"->fetch_assoc();
echo $b['name'] . " " . $b['secondname'];
}
}
DB::select()->insertos();
Профиль
15.04.2012 17:22:36 Создание объекта в классе БД Сообщение #7
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Теперь всё хорошо, только вот так писать можно, если Вы вызываете объект всего 1 раз:
DB::select()->insertos();
В противном случае, надо просто записать объект в переменную и дальше уже применять методы:
$db = DB::select();
$db->insertos();
$db->insertos();
Профиль
15.04.2012 17:26:19 Создание объекта в классе БД Сообщение #8
brussens

brussens

Мега-мастер

Мега-мастер

Дата регистрации:
11.10.2011 22:50:07

Сообщений: 438

Спасибо Михаил)) Это просто каркас))) Далее уже методы будут дописываться и класс будет использоваться для всего проекта)
Профиль