Как правильно использовать $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
161 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир