Имя Лабиринта, что вы говорите, называется «Dependency Injection» или DI короче.
В зависимости от вашего проекта, использующего глобальную проблему, можно решить проблему в краткосрочной перспективе, но если вы планируете создать большой проект, который вы позже тестируете и обмениваетесь несколькими людьми, вы бы вообще не хотели использовать глобальный. - Вы не можете проверить или отладить этот материал хорошо.
A (плохое) решение состоит в том, чтобы сделать вашу базу данных и базовый класс Singleton Pattern, чтобы избежать глобального эффекта, но при этом иметь тот же эффект. (не проверяемый, не настраивается)
public function __construct() {
$this->db = blueConnect::getInstance();
$this->core = blueCore::getInstance();
}
Решение этой проблемы, как правило, создать функции Factory, который создает все ваши услуг, которые нуждаются в базе данных и Core.
public function createService($name) {
$serviceClass = 'blue'.ucfirst($name).'Service';
return new $serviceClass($this->getDatabase(), $this->getCore());
}
И эта функция, как правило, часть реестра или лучше DI Контейнер как, например PIMPLE
Пример с только один экземпляр каждой службы:
public function createService($name) {
$serviceClass = 'blue'.ucfirst($name).'Service';
static $services = array();
if(!isset($services[$name])) {
$services[$name] = new $serviceClass($this->getDatabase(), $this->getCore());
}
return $services[$name];
}
Имейте в виду, что вы НЕ должны тестировать свой контейнер реестра/DI, поскольку у вас есть "глобальный" состояние внутри вашего контейнера. (например, извлечение одной и той же услуги дважды)
Да. Таким образом, вы можете избежать передачи этих параметров. –
Значит, вы оба порекомендовали бы глобальный? Единственная причина, по которой я не хотел ее использовать, заключалась в том, что в одном классе для многих функций требовалось, например, $ db, поэтому использование метода __construct показалось лучшей альтернативой. – zuc0001