Какой шаблон дизайна я могу использовать для эмуляции признаков /mixins в PHP?
Так как черты недоступны в PHP 5.3 AFAIK Мне нужно подражать некоторым функциональным возможностям, которые они предлагают. Интерфейсы не будут работать, потому что мне нужна конкретная функциональность.
Проблема:
У меня есть два класса клиентов, которым нужно поделиться некоторыми функциями, но они распространяются от разных базовых классов.
ClassA extends Foo {}
ClassB extends Bar {}
Мне нужно иметь возможность реализовать функцию, называемую getComponent() в обоих классах, и она должна быть идентичной функциональности.
Изменение базового класса не является вариантом. Я думал сделать что-то вроде этого:
Class ComponentHandler {
function getInstance() {
//return singleton
}
function getComponent() {
//required functionality
}
}
Class A extends Foo {
var $handler;
function __construct() {
$this->handler = ComponentHandler::getInstance();
}
}
Я бы реализовал этот конструктор как в ClassA, так и в ClassB. В моем клиенте я бы сделал следующие вызовы:
$class = new ClassA();
$class->handler->getComponent();
$class = new ClassB();
$class->handler->getComponent();
Ответы
Ответ 1
Я предпочитаю передавать объекты через конструктор, когда это возможно. У вашего метода есть зависимость от имени класса ComponentHandler
. Передавая объект через конструктор и добавляя подсказку типа , вы все равно добавляете зависимость, но тот, который позволяет вам создавать разные типы ComponentHandler
s
Class A extends Foo {
var $handler;
function __construct( ComponentHandler $handler ) {
$this->handler = $handler
}
}
$componentHandler = ComponentHandler::getInstance();
$class = new ClassA( $componentHandler );
Класс может принимать любой обработчик, расширяющий ComponentHandler, это тоже будет работать...
Class ComponentHandler2 extends ComponentHandler {}
$componentHandler = ComponentHandler2::getInstance();
$class = new ClassA( $componentHandler2 );