2016-09-14 3 views
1

Ich versuche zu implementieren eine Schnittstelle zweimal implementieren, die eine andere Schnittstelle, aber nicht in der Lage erstreckt, um herauszufinden, warum ich ein Fatal ErrorPHP - kann nicht die gleiche Schnittstelle zweimal

Hier ist mein Code bin immer:

interface a { 
    public function foo(); 
} 

interface b extends a { 
    public function baz(Baz $baz); 
} 

// This will work 
class c implements b { 
    public function foo() { 
    } 

    public function baz(Baz $baz) { 
    } 
} 

// This will not work and result in a fatal error 
class d implements b { 
    public function foo() { 
    } 

    public function baz(Foo $foo) { 
    } 
} 

ich erhalte diese Fehlermeldung:

Fatal error: Erklärung d :: baz() muss mit b :: baz (Baz $ baz) in K kompatibel sein: \ xampp \ htdocs \ oop \ Lec 2 \ index.php auf der Linie 26

Antwort

5

Ihre Klasse d hat die Methode baz falsch implementiert. Die Schnittstelle gibt an, dass sie ein Argument mit dem Typhint Baz aufnehmen muss, aber Sie verwenden den Typhint Foo - das Ändern des Argumenttyps von der Schnittstelle ist nicht zulässig. Das Update, in der Klasse d, wäre:

<?php 

class d implements b 
{ 
    public function foo() {} 
    public function baz(Baz $foo) {} 
} 

Die args der Funktion werden durch die Schnittstelle festgelegt und kann sich ändern nicht.

+0

Dank @Erik ich habe es. – luckyali444

1

Dies ist nicht Java, Sie können nicht (leider) Methoden überladen. Also, am Ende so etwas wie

class d implements b 
{ 
    public function foo() 
    { 
    } 

    public function baz(Foo $foo) 
    { 
    } 

    public function baz(Baz $baz) 
    { 
    } 
} 

Ergebnis wird in

Fatal error: Cannot redeclare d::baz() in [...][...] on line XX

Wenn eine Schnittstelle implementiert, Sie müssen implementieren es auf die gleiche Weise sie deklariert ist. Also, da baz mit Baz $baz Argument erklärt wird, müssen Sie implementieren es mit demselben Argument.

class d implements b 
{ 
    public function foo() 
    { 
    } 

    public function baz(Baz $baz) 
    { 
    } 
} 
+0

Ich bin dankbar. Es hat @Nordenheim geholfen – luckyali444

Verwandte Themen