Как правильно использовать $bd в ООП? Здравствуйте!
Пишу API, по которому будет работать клиентское десктопное приложение. Но вопрос общий, по ООП.
Использую фреймворк Fat-Free.
В index.php он подключается так:$f3 = require('lib/base.php');
А подключается к БД примерно так:$db = new DB\Mongo($f3->get('dbhost'),$f3->get('dbname'));
Чтобы не писать весь API в одном файле, хочу сделать несколько модулей, для каждого модуля свой класс. Ведь в API вся работа завязана на БД.
Возникает вопрос: как осуществить передачу объекта $f3 и $db в каждый модуль, и использовать их в объектах классов?
Передавать постоянно таким образом:class MyClass {
public $f3;
function __construct($f3) {
$this->f3=$f3;
}
function MyFunc() {
$this->f3->somebody();
}
}
$obj= new MyClass ($f3);
На мой взгляд, не очень рационально. Хотелось бы создавать эти объекты один раз, и не передавать их в объекты других классов, но использовать внутри этих объектов. Возможно ли это?
Как такое реализовано в различных движках, CMS? Как пишете вы?

21 Авг 2019 в 07:06
140 +1
1
Ответы
1

Для того чтобы не передавать объекты $f3 и $db в каждый модуль, вы можете использовать паттерн Dependency Injection (внедрение зависимостей). Этот паттерн позволяет внедрять необходимые зависимости в класс через конструктор или сеттеры, что делает код более гибким и уменьшает его связанность.

Например, вы можете создать класс, который будет отвечать за создание и хранение этих объектов, и внедрять их в другие классы при необходимости:

class DependencyContainer {
private $f3;
private $db;
public function __construct($f3) {
$this->f3 = $f3;
$this->db = new DB\Mongo($f3->get('dbhost'), $f3->get('dbname'));
}
public function getF3() {
return $this->f3;
}
public function getDB() {
return $this->db;
}
}
$dependencyContainer = new DependencyContainer($f3);
class MyClass {
private $f3;
private $db;
public function __construct(DependencyContainer $container) {
$this->f3 = $container->getF3();
$this->db = $container->getDB();
}
public function myFunc() {
$this->f3->somebody();
}
}
$obj = new MyClass($dependencyContainer);

Таким образом, вы можете создать DependencyContainer один раз и использовать его для внедрения зависимостей в разные классы. Это позволит уменьшить повторяющийся код и сделает вашу структуру более гибкой.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 093 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир