Bir arayüz PHP başka bir arabirimden kalıtımla bir yöntem üzerine yazılır yapma

2 Cevap php

Is there a way in PHP to overwrite a method declared by one interface in an interface extending that interface?

Örnek:

Herhalde yanlış bir şey yapıyor, ama burada ne var ediyorum:

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);
}

Bir şey uzatmak Normalde PHP, sen (değil mi?) Orada bulunan herhangi bir yöntem üzerine yazabilirsiniz. Bir arayüz başka uzanır Ancak, size izin vermez. Ben bu yanlış düşünüyorum sürece ... Ben iShipper arabirimini uygulamak, ben Gönderici nesne Satıcı nesnesi (yani iVendor arabirimini uygulayan) genişletmek yapmak zorunda değilsiniz. Ben diyorum ki:

class FedEx implements iShipper{}

ve FedEx iVendor ve iShipper gelen tüm yöntemleri uygulamak olun. Ancak, iVendor ve iShipper yılında __ construct fonksiyonları benzersiz olması gerekir. Ben $ kargo = null dışarı sürebilir biliyorum, ama o zaman (başlatmasını sırasında sadece vendors_no ve sevkiyat ileterek) Göndericileri oluşturmak için uygun olmaz.

Herkes bu işi yapmak için nasıl biliyor? Benim dönüş $ nakliyeci-> setShipment ($ sevkiyat) arayarak sevkiyat ayarlamak zorunda olduğunu; Gönderici ben örnekleriz, ama bunu yapmak zorunda aşmanın bir yolunu umut ediyorum sonra ...

A little more explanation for the curious:
The FedEx Object has methods that go to the FedEx site (using cURL) and gets an estimate for the Shipment in question. I have a UPS Object, a BAXGlobal Object, a Conway Object, etc. Each one has COMPLETELY different methods for actually getting the shipping estimate, but all the system needs to know is that they are a "shipper" and that the methods listed in the interface are callable on them (so it can treat them all exactly the same, and loop through them in a "shippers" array calling getTransitX() to find the best shipper for a shipment).

Each "Shipper" is also a "Vendor" though, and is treated as such in other parts of the system (getting and putting in the DB, etc. Our data design is a pile of crap, so FedEx is stored right alongside companies like Dunder Mifflin in the "Vendors" table, which means it gets to have all the properties of every other Vendor, but needs the extra properties and methods supplied by iShipper).

2 Cevap

@cmcculloh Evet, Java sen Interfaces Kurucular tanımlamak yok. Bu, belirli bir kurucu karşılamak zorunda endişesi olmadan çoklu arayüzler (hem izin, ve birçok durumda çok yararlı) uygulayan bir sınıf arayüzleri genişletmek ve aynı zamanda sahip hem verir.

EDIT:

Here's my new model:

A. Each interface no longer has a constructor method.
B. All Shippers (UPS, FedEx, etc) now implement iShipper (which extends iVendor) and extend the abstract class Shipper (which has all common non-abstract methods for shippers defined in it, getName(), getZip() etc).
C. Each Shipper has it's own unique _construct method which overwrites the abstract __construct($vendors_no = null, $shipment = null) method contained in Shipper (I don't remember why I'm allowing those to be optional now though. I'd have to go back through my documentation...).

Yani:

interface iVendor{
    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 getTransitTime($shipment = null);
    public function getTransitCost($shipment = null);
    public function getCurrentShipment();
    public function setCurrentShipment($shipment);
    public function getStatus($shipment = null);
}

abstract class Shipper implements iShipper{  
    abstract public function __construct($vendors_no = null, $shipment = null);  
    //a bunch of non-abstract common methods...  
}

class FedEx extends Shipper implements iShipper{  
    public function __construct($vendors_no = null, $shipment = null){
        //a bunch of setup code...
    }
    //all my FedEx specific methods...
}

Thanks for the help!
ps. since I have now added this to "your" answer, if there is something about it you don't like/think should be different, feel free to change it...

Sen yapıcısı düşüyorlar ve sadece her sınıfta onları koymak olabilir. Sonra ne var her sınıf bir nakliyeci veya satıcı ise bağlı muhtemelen aynı olan kendi __ tertibini sahiptir. Eğer sadece bu yapıları tanımlanmış olmasını istiyorsanız bir kez bu rota aşağı gitmek istediğini sanmıyorum.

Ne yapmak istediğinizi düşünün soyut bir satıcı uygulayan sınıf ve nakliyeci uygulayan biri yapmak olduğunu. Orada farklı Kurucular tanımlayabilirsiniz.

abstract class Vendor implements iVendor {
    public function __construct() {
        whatever();
    }
}

abstract class Shipper implements iShipper {
    public function __construct() {
        something();
    }
}