[PHP] Interfaces | Sinn?

  • Heyho,
    Seit dem ich mit dem Laravel Framework arbeite, stellt sich mir häufiger die Frage, wofür Interfaces eigentlich da sind, bzw. was der Sinn dahinter ist.
    Bringt es irgendwas was ich vllt. übersehe? Weil in meinen Augen erscheint es unlogisch wofür man welche verwenden sollte.
    Im Internet habe ich jetzt auch nichts wirklich hilfreiches/verständliches gefunden.


    Wäre über eine erklärung sehr dankbar.


    MfG,
    Slash™

  • Interfaces helfen eigentlich nur, das du nichts vergisst

    jein... Interfaces dienen als "Vorlage" für eine Klasse, bzw. jede Klasse die dieses Interface implementiert hat garantiert den Aufbau, der im Interface angegeben wird.

    Mit freundlichen Grüßen
    Developer
    Go/Python Developer | ehm. Webdeveloper | Fachinformatiker Anwendungsentwicklung
    Arbeitet in einem cloudigen Umfeld bei einem der größten deutschen Rechenzentrumsbetreibern

  • Du kannst dadurch halt nichts vergessen, weil alles überschrieben werden muss, daher vermeidest du damit Fehler.

    ▬|██████|▬
    This is Nudelholz.
    Copy Nudelholz in your Signatur
    to make better Kuchens
    and other Teigprodukte!

  • Interface.php

    PHP
    <?php
    interface blub {
     public function machEtwas($params1,$param2);
    }


    klasse.php

    PHP
    <?php
    require_once('interface.php');
    class Blab implements blub{
    // Jede vernünftige IDE schmeißt jetzt nen Fehler, bzw. bietet jetzt an die Funktionen aus dem Interface zu implementieren
    public function machEtwas($param1,$param2){
    echo "Ich mache etwas!";
    }
    }


    Aufruf der Klasse:

    PHP
    <?php
    require_once('klasse.php');
    $klasse = new Blab();
    $klasse->machEtwas('syes','param2');
    // Ausgabe: Ich mache etwas!

    Mit freundlichen Grüßen
    Developer
    Go/Python Developer | ehm. Webdeveloper | Fachinformatiker Anwendungsentwicklung
    Arbeitet in einem cloudigen Umfeld bei einem der größten deutschen Rechenzentrumsbetreibern

  • Ihr erklärt zwar alle, was Interfaces sind und geht auf einen Sinn ein, doch den wichtigsten und schönsten Part lasst ihr aus.


    Fangen wir vorne an. Seit einigen Jahren sind MVC-Frameworks (z.B. Laravel) heftig am kommen. Da jedes vernünftige Framework modular, also auf ersetzbaren Komponenten, aufgebaut ist, sind Interfaces unabdingbar. Warum? Diese Frameworks bieten einen Container, der nach dem IoC-Konzept (oder einem sehr ähnlichen Konzept) arbeitet. IoC heißt "Inversion of Control". Das ist im ersten Moment irreführend, da IoC im Zusammenhang mit Containern sich viel eher auf Dependency Injection bezieht. Einigen dürfte direkt etwas klar werden, für den Rest nun eine Erklärung. Dependency Injection heißt, dass Abhängigkeiten (z.B. Klassen) dynamisch vom Container eingespeist ("injiziert") werden. IoC bedeutet in diesem Context, dass die ganze "Macht" (hehe) vom Container ausgeht, der die einzelnen Klassen (oder gar Instanzen) für die jeweiligen Interfaces verwaltet.


    Das ist nun etwas trocken, deshalb hier mal ein Anwendungsbeispiel: Wir haben ein Logger-Interface (LoggerInterface). Nun gibt es mehrere Logger, sagen wir FileLogger und MailLogger. In der Entwicklungsumgebung möchten wir den FileLogger benutzen, im Produktivbetrieb den MailLogger, um immer direkt per E-Mail über Fehler benachrichtigt zu werden. Nun könnte man natürlich jedes Mal den Logger komplett ändern, oder aber man lässt die beiden Logger das LoggerInterface implementieren und ändert nur den Verweis darauf im Container und die Abhängigkeit wird jedes mal resolved, wenn das LoggerInterface type-hinted wird.


    P.S. Wie sinnvoll das o.g. Beispiel ist, darüber lässt sich streiten, insbesondere in Anbetracht der Tatsache, dass es Monolog gibt.

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

    Einmal editiert, zuletzt von Klemmlampe () aus folgendem Grund: Tippfehler ausgebessert

  • Noch ein Beispiel:


    Du hast ein Interface mit dem Namen IVehicle. Dieses Interface besitzt drei Methoden namens start(), stop() und status().
    Wenn du jetzt zwei Klassen ("Car" und "Airplane") hast und beide Klassen dieses Interface implementiert haben, kannst du folgendes machen:



    Beide Fahrzeuge werden nun ein- und ausgeschaltet, obwohl diese intern eventuell ganz verschieden sind.


    Code
    Automotor ausgeschaltet
    Automotor eingeschaltet
    Automotor ausgeschaltet
    
    
    Flugzeugmotoren ausgeschaltet
    Flugzeugmotoren eingeschaltet
    Flugzeugmotoren ausgeschaltet


    index.php Pastebin
    IVehicle.php Pastebin
    Car.php Pastebin
    Airplane.php Pastebin


    PS: Das hätte auch mit einer abstrakten Klasse so funktioniert, da die Methoden in einem Interface eigentlich nichts anderes sind als "abstrakte" Methoden (da nicht ausprogrammiert)