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