PHP中有没有一种方法可以覆盖扩展该接口的接口中的一个接口声明的方法?
这个例子:
我可能做错了什么,但这是我所拥有的:
interface iVendor{
public function __construct($vendors_no = null);
public function getName();
public function getVendors_no();
public function getZip();
public function getCountryCode();
public function setName($name);
public function setVendors_no($vendors_no);
public function setZip($zip);
public function setCountryCode($countryCode);
}
interface iShipper extends iVendor{
public function __construct($vendors_no = null, $shipment = null);
public function getTransitTime($shipment = null);
public function getTransitCost($shipment = null);
public function getCurrentShipment();
public function setCurrentShipment($shipment);
public function getStatus($shipment = null);
}
通常在 PHP 中,当您扩展某些内容时,您可以覆盖其中包含的任何方法(对吗?)。但是,当一个接口扩展另一个接口时,它不会让您这样做。除非我想错了……当我实现 iShipper 接口时,我不必让 Shipper 对象扩展 Vendor 对象(实现 iVendor 接口)。我只是说:
class FedEx implements iShipper{}
并使 FedEx 实现 iVendor 和 iShipper 的所有方法。但是,我需要__construct
iVendor 和 iShipper 中的功能是独一无二的。我知道我可以取出$shipment = null
,但是创建 Shippers 就不那么方便了(只需在实例化时传入 vendor_no 和货件)。
任何人都知道如何使这项工作?我的后备方案是在实例化后必须通过调用$shipper->setShipment($shipment);
Shipper 来设置发货,但我希望有一种方法可以绕过必须这样做......
对好奇的人进行更多解释:
FedEx 对象具有访问 FedEx 站点(使用 cURL)并获取相关货件的估计值的方法。我有一个 UPS 对象、一个 BAXGlobal 对象、一个 Conway 对象等。每个对象都有完全不同的方法来实际获取运费估算,但系统需要知道的是它们是“托运人”,并且列出的方法接口可以在它们上调用(因此它可以完全一样地对待它们,并在“托运人”数组中循环遍历它们,调用getTransitX()
以找到货物的最佳托运人)。
虽然每个“托运人”也是一个“供应商”,并且在系统的其他部分(获取和放入数据库等)中都被视为这样。我们的数据设计是一堆废话,所以联邦快递与像这样的公司一起存储“供应商”表中的 Dunder Mifflin,这意味着它可以拥有所有其他供应商的所有属性,但需要 iShipper 提供的额外属性和方法)。