【问题标题】:What design pattern can I use to emulate traits / mixins in PHP?我可以使用什么设计模式来模拟 PHP 中的特征/混合?
【发布时间】:2011-08-13 02:36:36
【问题描述】:

由于特性在 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();

【问题讨论】:

  • 我认为您提出的方法实际上是可行的方法(顺便说一下,它叫做Composition)。
  • 请分别添加所需的空格来阐明 ClassA 和 Class A 语法。同意@Brian - 你所拥有的不仅足够,而且比使用 Galen 建议的实现引入更多 DI 更好(虽然经典且仍然可用)[下文]。

标签: php design-patterns traits


【解决方案1】:

我更喜欢尽可能通过构造函数传递对象。您的方法依赖于类名ComponentHandler。通过构造函数传递对象并添加type hint,您仍然添加了一个依赖项,但它允许您创建不同类型的ComponentHandlers

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 );

【讨论】:

  • 我想知道如何处理依赖关系。感谢您的帮助。
猜你喜欢
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多