Как правильно использовать $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? Как пишете вы?
Для того чтобы не передавать объекты $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 один раз и использовать его для внедрения зависимостей в разные классы. Это позволит уменьшить повторяющийся код и сделает вашу структуру более гибкой.
Для того чтобы не передавать объекты $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 один раз и использовать его для внедрения зависимостей в разные классы. Это позволит уменьшить повторяющийся код и сделает вашу структуру более гибкой.