Возьмите следующий код в качестве примера того, что я хочу:
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: // ---------------------- } }
Я хочу реализовать класс фабрики.
Предположим, я хотел иметь MySQLSomethingRepository, у которого есть данные, поступающие из MySQL … впрыскивается в мой SomethingController … Где-то мне нужно объявить, что
SomethingController( new MySQLSomethingRepository() )...
который, надеюсь, будет рассмотрен моим классом фабрики …
Текущий способ, которым я занимаюсь, заключается в том, что это прямое соединение с источником данных … что очень затрудняет выполнение тестовых примеров:
private $somethingRepository = new MySQLSomethingRepository();
поэтому представьте, если бы я использовал этот же репозиторий в нагрузках других контроллеров, и я хочу изменить источник базы данных на некоторые json-данные, и я реализую следующий репозиторий «JsonSomethingRepository», мне нужно пойти и изменить все контроллеры на:
private $somethingRepository = new JsonSomethingRepository();
Как я могу реализовать свой класс Factory, чтобы он мог справиться с созданием экземпляров, которые класс контроллера требует в функции AddBindings?