Intereting Posts
Один элемент викторины на страницу (программа тестирования php / mysql) Проверить значение NULL в переменной, которая не может быть установлена Редактор JavaScript и CSS в joomla Настройка рамки Laravel (и общего) для папки «Public» FB не определен и запрашивает ошибку mysql query PHP: Я хочу, чтобы определенные элементы были первыми, а затем отсортировать остальные элементы Создание ZIP-файлов с PHP + Apache на лету на высокой скорости? Извлечение данных из таблицы соединений в Yii2 MAMP / PHP.INI: параметр date.timezone в phpinfo () показывает «нет значения», даже если значение установлено в php.ini Ошибка подключения к MySQL. Не удается подключиться к серверу MySQL на «http» (4) PHP Создайте несколько CSV-файлов в памяти, затем сжимайте OneNote API не может получать заметки из общего ноутбука для обмена пользователями CakePHP: как использовать миграцию для вставки записей Как преобразовать этот массив? Правильный способ получения данных POST JSON с Android на PHP

Как реализовать заводский класс с использованием PHP – Зависимость впрыска

Возьмите следующий код в качестве примера того, что я хочу:

class SomethingController extends Factory { private $somethingRepository; public function __Construct( ISomethingRepository $repo ) { $this->somethingRepository = $repo; } } class Factory { public function __Construct() { // The following call to AddBinding would push into SomethingController the new instance of the class denoted in my AddBinding second parameter. $this->AddBinding( ISomethingRepository, MySQLSomethingRepository); // So in this case, if the controller i'm extending has a construct parameter of ISomethingRepository, then make the parameter equal a new MySQLSomethingRepository() // Then if I want to use JSONSomethingRepository in the future, I only have to change the one AddBinding call and the controller will still work. } public function AddBinding( $interface, $concrete ) { // Somehow assign the constructor properties of the extending class as new instances of the bindings i have called upon in the construct of my factory class (see this class's construct) // Pseudo code: // ---------------------- $calledClass = get_called_class(); $class = new \ReflectionClass( $calledClass ); $method = $class->getMethod( "__construct" ); $params = $method->getParameters(); foreach( $params as $param ) { if ( $param == $interface ) { return new $concrete; } } // /Pseudo code: // ---------------------- } } 

Я хочу реализовать класс фабрики.

  • Этот заводский класс будет расширен классом контроллера.
  • фабричный класс будет рассматривать конструктивные параметры класса контроллера и создавать новые экземпляры объекта, основанные на моем методе AddBindings на заводе.

Предположим, я хотел иметь MySQLSomethingRepository, у которого есть данные, поступающие из MySQL … впрыскивается в мой SomethingController … Где-то мне нужно объявить, что

 SomethingController( new MySQLSomethingRepository() )... 

который, надеюсь, будет рассмотрен моим классом фабрики …

Текущий способ, которым я занимаюсь, заключается в том, что это прямое соединение с источником данных … что очень затрудняет выполнение тестовых примеров:

 private $somethingRepository = new MySQLSomethingRepository(); 

поэтому представьте, если бы я использовал этот же репозиторий в нагрузках других контроллеров, и я хочу изменить источник базы данных на некоторые json-данные, и я реализую следующий репозиторий «JsonSomethingRepository», мне нужно пойти и изменить все контроллеры на:

 private $somethingRepository = new JsonSomethingRepository(); 

Как я могу реализовать свой класс Factory, чтобы он мог справиться с созданием экземпляров, которые класс контроллера требует в функции AddBindings?