Feinheiten (Kuriositäten?) Der Arbeit mit Schnittstellen

    Wissen Sie, was die Schnittstelle% username% ist?
    Wenn ja, dann denke ich, dass dieser Code keine Fragen aufwirft. PHP Feinheiten (Kuriositäten?) Der Arbeit mit Schnittstellen
    interface someInterface{
    	public function someMethod();
    }
    interface anotherInterface{
    	public function someMethod();
    }
    class Foo implements someInterface,anotherInterface {
    	public function someMethod(){
    		echo 'someMethod() was called'.PHP_EOL;
    	}
    }
    $foo = new Foo();
    $foo->someMethod();
    

    Also, was wird das Skript als Ergebnis seiner Arbeit anzeigen.
    Die Antwort liegt unter der Katze.
    TrollfaceDie richtige Antwort lautet: "Schwerwiegender Fehler: Abstrakte Funktion kann nicht geerbt werden ..." Aber warum? - Sie fragen zu Recht. Ich habe die gleiche Frage gestellt, als ich darauf stieß. Wie die Suche zeigte, ist dies eine Eigenart, Würde, Nachteil, Dummheit, Vorteil (Unterstreichung) von PHP. Schauen wir uns das php.net/manual/en/language.oop5.interfaces.php Tutorial anin denen sie so schreckliche Dinge schreiben "Hinweis: Eine Klasse kann nicht zwei Schnittstellen implementieren, die Funktionsnamen gemeinsam haben, da dies zu Mehrdeutigkeiten führen würde." Mit anderen Worten, in PHP kann eine Klasse nicht mehrere Schnittstellen implementieren, die dieselben Methoden enthalten, da dies zu Mehrdeutigkeiten führt. Hör auf, hör auf, hör auf ... Lass es uns herausfinden. Erinnern wir uns an die Mehrfachvererbung in C ++.
    class someClass {
      public:
        void someMethod(){
        };
    }
    class anotherClass {
      public:
        void someMethod(){
        };
    }
    class fooClass: someClass,anotherClass{
    }
    int main () {
      fooClass foo;
      foo.someMethod();
      return 0;
    }
    

    c ++Hier ist die Unsicherheit vorhanden, da nicht klar ist, welche der Methoden vererbt wird (na ja, fast). Schnittstellen wurden nur erfunden, um Kollisionen aufzulösen, die sich aus der Vererbung mehrerer Klassen ergeben. Grob gesagt ist eine Schnittstelle nur ein „Befehlssatz“, der besagt, dass eine Klasse, die sie implementiert, solche Methoden implementieren sollte. Eine Schnittstelle enthält keine Implementierung einer Methode, daher ist es der Klasse egal, ob sie viele Schnittstellen mit denselben Methoden implementieren muss. Ich wiederhole, dies ist nur eine „Anweisung“, die der Klasse mitteilt, dass diese Methode implementiert werden soll. Es gibt nur einige dieser Anweisungen. Die Logik der PHP-Entwickler ist nicht ganz klar, warum wir das Ding wieder haben, was funktioniert nicht wie überall sonst? Warum kann eine Klasse keine Schnittstellen mit denselben Methoden implementieren? Warum führt dies zu Mehrdeutigkeiten?

    UPD1: Aus irgendeinem Grund spricht die zweite Person in den Kommentaren davon, die Methoden von en.wikipedia.org/wiki/Method_overloading zu überladen (derselbe Methodenname, aber verschiedene Aufrufsignaturen: verschiedene Arten von Parametern, die an die Methode übergeben werden, ihre Nummer usw.). Vielleicht habe ich etwas nicht richtig erklärt, aber in dem Artikel geht es nicht um Überladung. Tatsächlich unterstützt PHP diesen Mechanismus nicht. In diesem Fall hat dieser Mechanismus jedoch keine Beziehung zu einer Mehrfachimplementierung von Schnittstellen.
    Wiederum kann eine Klasse in PHP nicht mehrere Schnittstellen implementieren, die dieselben Methoden enthalten. In Java / C # / etc ist Folgendes möglich:
    public interface someInterface {
    	public void someMethod();
    }
    public interface anotherInterface {
    	public void someMethod();
    }
    public class fooClass implements anotherInterface,someInterface {
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		fooClass fooClass = new fooClass();
    		fooClass.someMethod();
    	}
    	@Override
    	public void someMethod() {
    		System.out.println("someMethod() was called");	
    	}
    }
    


    UPD: 2 Lösung des gleichen Problems in C # habrahabr.ru/blogs/php/116916/#comment_3808966
    UPD: 3 überprüfte den gleichen Code in D en.wikipedia.org/wiki/D_%28programming_language%29 es scheint wie eine brandneue oop-Sprache, es funktioniert Die ED-Datei funktioniert ordnungsgemäß:
    import std.stdio;
    import std.stream;
    interface D{
        void foo();
    }
    interface A{
        void foo();
    }
    class E : D, A{
    	void foo(){
    		writefln("foo() was called");
    	}
    }
    void main (string[] args){
    	E e = new E();
    	e.foo();
    }
    alagar@home:~/d$ dmd  -run  e.d 
    foo() was called
    

    Jetzt auch beliebt: