Какой шаблон дизайна я могу использовать для эмуляции черт / миксинов в PHP? - PullRequest
13 голосов
/ 26 апреля 2011

Поскольку черты недоступны в 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 Ответ

5 голосов
/ 26 апреля 2011

Я предпочитаю передавать объекты через конструктор всякий раз, когда это возможно. Ваш метод зависит от имени класса ComponentHandler. Передавая объект через конструктор и добавив подсказку type , вы все равно добавляете зависимость, но такую, которая позволяет создавать другой тип 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 );
...