anonimen каза:
В случая аз инжектирам Connection в два различни класа и съответно ще бъдат създадени два обекта, което пък значи че ще имам две конекции.
PHP:
$connection = /* по някакъв начин получаваш конекцията.
Може с new, или от някъде другаде */;
$modelOne = new ModelOne($connection);
$modelTwo = new ModelTwo($connection);
Така имаш една инстанция на конекцията в 2 обекта.
Принципно е така, обаче този пример е прекалено прост и при мене реално няма как да се случи. Ето как стоят нещата при мен.
Входа ми е един index.php в който, зареждам в този ред Config, Loader и Container.
Config ми е много важен защото с него зареждам различни масиви с конфигурации и го ползвам на много места в приложението, и той е един от класовете който, искам да има само една инстанция.
За Loader е ясно само ще добавя че и той ползва Config.
В Container вече чрез reflection правя обектите. Имам един метод make, който получава като параметър име на клас. Правя проверки дали в конструктора е инжектиран интерфейс, нормален клас, сингълтон и т.н. и зареждам според проверките правилния клас, който вече също може да си има зависимости и така. Класът който подавам като параметър на Container е App. В него инжектирам всички останали класове, които ми трябват, като Validator, View, FrontController и т.н. Това всичко е преди да съм почнал да пиша някакъв сайт примерно.
Основното е че след Container всичко се инжектира, и няма къде да пиша да го наречем свободен код
като примера който си дал горе. Реално единственото място в което имам new class() e index.php.
PHP:
require_once realpath('../application/Config.php');
require_once realpath('../application/Loader.php');
$loader = application\Loader::getInstance();
$loader->load();
$container = application\Container::getInstance();
$app = $container->make('application\App');
$app->appRun();
Ще дам и бейсик пример с контролер и един модел, все едно почвам да пиша някакъв сайт.
PHP:
Class UserController {
private $_view;
private $_model;
public function __construct(View $view, UserModel $model) {
$this->_view = $view;
$this->_model = $model;
}
public function register() {
$this->_model->register($firstName);
$this->_view->display('register');
}
}
Class UserModel {
private $_database;
private $_validation;
public function __construct(Database $database, Validation $validation){
$this->_database = $database;
$this->_validation = $validation;
}
public function register($firstName) {
$this->_validation->setRule('alphacyrillic', $firstName, '', 'alpha');
if ($this->_validation->validate() === TRUE) {
$this->_database->prepare('INSERT INTO user (first_name) VALUES(?)', array ($firstName))->execute(); }
}
}
Както виждаш всички обекти идват в конструкторите. Нека си представим че имам други модели и контролери, които не са свързани по никакъв начин с тези, но трябва да ползват същата инстанция на database, на Config, и на т.н. В случая тези класове са ми сингълтони и всичко си е ок, ама нали е антипатерн
. За това питам за алтернатива.
Доста дълъг ми стана поста, дано да ме разберете
.