2013-10-02 8 views
7

uyumlu olmalıdır t bunu:PHP - - Arayüz miras beyanı ben arayüzüne sahip

interface ExactMapper implements AbstractMapper 
{ 
    public function objectToArray(Product $object); 
} 

veya bu:

interface ExactMapper extends AbstractMapper 
{ 
    public function objectToArray(Product $object); 
} 

hatası

Yani, PHP bunu yapmanın bir yolu yoktur "beyan uyumlu olmalıdır" var?

+1

ama burada benim iki cents- Bu hata iletisi değil yapmaktır var arayüz kalıtım ile. Bu hata, PHP'nin muhtemelen kullandığınız diğer dillerdeki (ör. Java, C++) gerçek işlev/yöntem aşırı yüklenmesini desteklememesidir. – anotheruser1488182

cevap

10

Hayır, bir arayüz tamuygulanması gerekir. Eğer daha spesifik bir alt sınıfa uygulanmasını kısıtlayan, bu aynı arayüz/imza değil. PHP, jenerik veya benzer mekanizmalara sahip değildir.

Hep elle elbette kodunda kontrol edebilirsiniz: Ben bu şimdi bir kaç yıl önce gönderilmiş biliyorum

if (!($object instanceof Product)) { 
    throw new InvalidArgumentException; 
} 
+0

ama buna dayanarak, başka bir arayüz oluşturmak deneyin. Uygulamayın, ancak kısıtlama ile devralın. – violarium

+0

Gerçekten sen uzatmak veya uygulamak farketmez. Arabirim beyanı, dönem değiştiremezsiniz. Bar'ın uygulaması Foo'nun belirttiğinden çok daha kısıtlı olduğunda Foo'nun Bar'ı uygulayacağını söyleyemezsiniz. – deceze

-3
interface iInvokable { 
    function __invoke($arg = null); 
} 

interface iResponder extends iInvokable { 
    /** Bind next responder */ 
    function then(iInvokable $responder); 
} 

class Responder implements iResponder { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 

    /** Bind next responder */ 
    function then(iInvokable $responder) 
    { 
     // TODO: Implement then() method. 
    } 
} 

class OtherResponder implements iResponder { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 

    /** Bind next responder */ 
    function then(iInvokable $responder) 
    { 
     // TODO: Implement then() method. 
    } 
} 

class Invokable implements iInvokable { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 
} 

$responder = new Responder(); 
$responder->then(new OtherResponder()); 
$responder->then(new Invokable());