3

我是 OOP 的新手,我有一个非常基本的问题,但我无法以简洁的方式解释它,因此很难找到答案。

我有一个支持信用卡处理的应用程序,我想抽象处理能力,以便可以添加其他提供程序(linkpoint、authorize.net 等)。我想我想做的是创建一个看起来像这样的简单类:

class credit {

    function __construct($provider){
        // load the credit payment class of $provider
    }

}

然后我会让每个提供者扩展这个类,例如

class linkpoint extends credit { }

但我真的想使用信用等级更像是一个界面,有点。我不想要一个信用对象,我想做类似的事情:

$credit = new credit('linkpoint');

然后我希望 $credit 成为链接点类的一个实例。或者至少,我希望所有方法都执行链接点类中定义的代码。

解决这个问题的最佳方法是什么?或者有更好的方法吗?

4

4 回答 4

5

这称为“工厂模式”(另请参阅设计模式

你可以这样处理

class Credit
{
  public function __construct($factory)
  {
    $object = null;

    switch($factory) {
      case 'linkpoint':
        $object = new linkpoint();
        break;
      case 'xy':
        //...
    }
    return $object;
  }
}
于 2012-05-10T17:34:57.917 回答
4

我不确定我是否做对了,但是当你想 $credit 作为链接点的一个实例时,你只需要做

$linkPointCredit = new linkpoint();

顺便提一句。您的班级名称应始终以大写字母开头。

更新:

那么你确实可以使用工厂模式。

class Credit
{
    private $provider;

    public function __construct($provider)
    {
        if(class_exists($provider) {
            $this->provider = new $provider();
        }
    }
}
于 2012-05-10T17:34:19.087 回答
1

您所描述的听起来像是工厂设计模式。除了不使用构造函数之外,您将在基Credit类上有一个类(静态)方法,该方法返回您的子类之一的实例,具体取决于传递的字符串。

于 2012-05-10T17:36:08.167 回答
0

我会推荐“依赖注入”。

class credit {

    function __construct(Provider $provider)
    {
        $this->setProvider($provider);
    }

}

class Provider {}
class Linkpoint extends Provider {}
class crossave extends Provider {}
class Debitcentral extends Provider {}

然后你可以像这样使用它们:

$linkpoint = new Linkpoint();
$credit = new Credit($linkpoint);

$crossave = new Crossave();
$credit = new Credit($crossave);

$debitcentral = new Debitcentral();
$credit = new Credit($debitcentral);
// etc...
于 2012-05-10T17:38:47.357 回答