Я использую класс Factory для управления созданием объектов и передаю в их конструкторы любые объекты зависимостей (Dependency Injection), например
function createBasket() {
//pass in dependent objects
$apiCon = $this->createAPIConnector($this);
$basket = new Basket($this, $apiCon);
return $basket;
}
Я стараюсь избегать использования ключевого слова new в любых классах (кроме Factory), чтобы сделать возможным более простой и надежный модульный тест, более понятный код и т. Д.
Теперь мой вопрос относится к значениям конфигурации, которые требуются многим классам, например,
$apiURL = 'http://some.api.com';
$apiKey = 'abcde12345';
$adminEmail = 'someone@site.com';
Эти значения остаются постоянными для каждого экземпляра приложения. В настоящее время они находятся в одном классе Config, и они доступны из любого класса следующим образом:
$cfg = Config::getInstance();
$address = $cfg->apiURL;
Однако этот экземпляр класса все еще является зависимостью в любом Классе, который его вызывает, поэтому я должен подумать о передаче этого в конструкторы класса, например
function createBasket() {
//pass in dependent objects
$apiCon = $this->createAPIConnector($this);
$cfg = Config::getInstance();
//pass singleton config object to constructor
$basket = new Basket($this, $apiCon, $cfg);
return $basket;
}
... или, возможно, передать их через метод set, а не через конструктор:
function createBasket() {
//pass in dependent objects
$apiCon = $this->createAPIConnector($this);
$basket = new Basket($this, $apiCon);
//pass singleton config object to setter
$basket.setConfig(Config::getInstance());
return $basket;
}
Будем весьма благодарны за любые рекомендации относительно наилучшего подхода.
Спасибо, Джеймс