基本PHP继承

基本PHP继承,php,oop,Php,Oop,我是OOP新手,我有一个问题必须非常基本,但我很难用简洁的方式解释,所以很难找到答案 我有一个支持信用卡处理的应用程序,我想抽象处理功能,以便添加其他提供商(linkpoint、authorize.net等)。我想我要做的是创建一个简单的类,看起来像这样: class credit { function __construct($provider){ // load the credit payment class of $provider } } 然后我会

我是OOP新手,我有一个问题必须非常基本,但我很难用简洁的方式解释,所以很难找到答案

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

class credit {

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

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

class linkpoint extends credit { }
但我真的想把credit类更像是一个接口。我不想要信用对象,我想做如下事情:

$credit = new credit('linkpoint');
然后我希望$credit是linkpoint类的一个实例。或者至少,我希望所有的方法都执行linkpoint类中定义的代码


最好的方法是什么?或者有更好的方法吗?

我不确定我是否做对了,但是当你想把$credit作为linkpoint的一个实例时,你只需要这样做

$linkPointCredit = new linkpoint();
顺便说一句,你的类名应该总是以大写字母开头

更新:

然后您确实可以使用工厂模式

class Credit
{
    private $provider;

    public function __construct($provider)
    {
        if(class_exists($provider) {
            $this->provider = new $provider();
        }
    }
}
这称为“”(另见)

你可以这样处理

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

    switch($factory) {
      case 'linkpoint':
        $object = new linkpoint();
        break;
      case 'xy':
        //...
    }
    return $object;
  }
}

你所描述的听起来像一个故事。除了不使用构造函数之外,您的基本
Credit
类上将有一个class(static)方法,该方法根据传递的字符串返回一个子类的实例。

我建议使用“依赖注入”

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

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

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

$debitcentral = new Debitcentral();
$credit = new Credit($debitcentral);
// etc...

但是它不应该被命名为
$credit
,它应该被命名为
$linkpointcredit
或者更具体的名称。不过我希望能够以更编程的方式创建它。例如,如果我正在从数据库加载要使用哪个提供者的参数,我只想将它扔到$credit类上,正如我前面所述。所有的方法对于每个类都是相同的(即每个类都有收费、退款等方法)。因此,一旦它被实例化,应用程序本身对信贷提供商来说是不可知的。谢谢Johannes-我给了Dan答案,因为他首先提到了工厂模式。看起来是这样的!非常感谢。注意:下面Brian提到应该使用Credit类中的方法来完成。这是代替使用构造函数的最佳实践吗?追溯代码很有帮助,但如果您将其命名为
CreditFactory
或类似的名称,那么它就说明了问题。但最终,这涉及到你整个项目的品味和一致性。我可能会坚持前面提到的依赖注入,因为它更具耦合性,并且没有神奇的对象创建。我希望这有帮助:)
$linkpoint = new Linkpoint();
$credit = new Credit($linkpoint);

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

$debitcentral = new Debitcentral();
$credit = new Credit($debitcentral);
// etc...