2011-02-04 65 views
2

使用PHP设计可以尽可能轻松添加的模块化系统的最佳方法是什么?例如,如果您有购物车,则可能有一个支付基类,其中包含所有必需的方法。然后你可以有一个Paypal类来扩展这个类,一个Visa/Mastercard也可以扩展基类,但是你怎样才能真正把它们投入使用?PHP:模块化支付系统的最佳设计?

如果您制作了购物车的功能版本,则可以创建一个名为doExecute的功能并传递所需的信息。然后您将所有文件命名为Payment_Method.php。然后读取文件名称,创建可接受的付款方式列表。一旦选择了一个,该文件是该脚本中包含的唯一一个文件,然后调用doExecute方法来确保在支付方法include文件中的方法是所调用的方法。

但是,对于一个面向对象的方法,这确实能很好地工作。如何添加其他方法而不必修改代码以包含新类的对象?

回答

0

我实现了支付系统,这样是这样的正如你所提到的那样拥有基类,但让基类实例化了所需的支付供应商,该供应商扩展了基类。然后,基类是被加载哪些文件,集中控制,记录控制,等等

public function loadVendor($vendorName) { 
    static $validVendors = array('credit_card','paypal'); 
    if (!in_array($vendorName, $validVendors) { 
     return false; 
    } 
    include('/path/to//vendors/'.$vendorName.'.php'); 
    $processor = new $vendorName(); 
    //additional default setup 
    return $processor 
} 

因为所有的厂商有不同的数据提交结构。你的基类应该有一个函数来“加载”数据。这把它放在你的标准格式中。然后,每个支付类将具有“地图”功能,以将您的结构映射到其结构。例如,将日期分成不同的年份,月份,日期字段。

然后您有一个“提交”功能将数据提交给处理供应商。然后使用“解析响应”功能解析响应并将其放入您想出的标准化响应数据结构中。

为简单起见,您可以使用一种方法调用所有三个函数(map-> submit-> map。但是为了测试,更容易将它们分开。 $ processor-> submit(); $ response = $ processor-> parseResponse();

当然,这并不真正适用于PayPal。贝宝是异步的,你发送用户到他们的网站。然后Paypal在完成处理后将它们发送回您的网站。 Google checkout也是一样。

0

我会做这种方式:

使用一个基类所有的支付系统(如你所提到的)

各支付系统(如贝宝)扩展了支付类,你可以加载所有的PHP文件..只是确保他们都有一个名称对应的文件,反之亦然..

然后当选择付款选项,而不是加载单个文件,您可以创建该实例的对象..并总是调用该对象相同的名称,如$ activePaymentGateway或类似的东西。

然后,当您调用$ activePaymentGateway-> processPayment(500,'EUR'); (或者 - > doExecute()就像你的例子那样),或者其他什么,相应的类应该知道那里发生了什么。

每班不应实际定义,除了需要从基类继承的任何一个公共职能

我希望它能帮助