我是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成为linkpoint类的一个实例。或者至少,我希望所有方法都能执行linkpoint类中定义的代码。
最好的方法是什么?或者有更好的方法吗?
答案 0 :(得分:5)
这称为“factory pattern”(另见Design patterns)
你可以像这样处理它
class Credit
{
public function __construct($factory)
{
$object = null;
switch($factory) {
case 'linkpoint':
$object = new linkpoint();
break;
case 'xy':
//...
}
return $object;
}
}
答案 1 :(得分:4)
我不确定我是否正确,但是如果你想将$ credit作为linkpoint的一个实例,那么你就必须这样做
$linkPointCredit = new linkpoint();
顺便说一下。您的班级名称应始终以大写字母开头。
<强>更新强>
然后你确实可以使用工厂模式。
class Credit
{
private $provider;
public function __construct($provider)
{
if(class_exists($provider) {
$this->provider = new $provider();
}
}
}
答案 2 :(得分:1)
您所描述的内容听起来像Factory Design Pattern。除了使用构造函数之外,您将在基类Credit
类上拥有一个类(静态)方法,该方法返回一个子类的实例,具体取决于传递的字符串。
答案 3 :(得分: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...