Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Was bringt interface?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Was bringt interface?

    Guten Tag, ich habe mich in den letzten Tagen ausgiebig mit OOP beschäftigt, habe allerdings beim Thema interface so meine Probleme. Ich verstehe den Sinn von selbigen nicht wirklich. Vorteil habe ich gelesen, ist, dass man eine "Schablone" für die Klasse schafft. Und daher meine Frage: Sollte man für jede Klasse eine interface verwenden und alle Methoden dieser Klasse auslagern, oder nur das Ganze, wenn man mehrere Klassen hat, die dasselbe interface implementieren. Manch einer mag lachen, aber mir mangelts da wirklich an Verständnis.


  • #2
    Kurz: Ein Interfaces entkoppelt die Verfügbarkeit von Methoden und dessen Methoden-Signaturen von der eigentlichen Implementierung als Klasse.

    Setz du als Typehint eine Klasse, kannst du nur Instanzen dieser Klasse oder ihrer Erben dort übergeben. Setz du als Typehint ein Interface so kann jede Klasse die dieses Interfaces implementiert dort übergeben werden.
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #3
      Setzt du also Interfaces nur für Typehinting ein. Weil das muss man doch nicht bei JEDER Klasse machen, nur dass sichergestellt ist, dass die Implementierung entkoppelt ist. Oder was sagst du dazu.

      Kommentar


      • #4
        OOP in PHP finde ich eigentlich ziemlich unnötig, wenn ihr mich fragt.

        Interfaces dienen in richtigen OOP-Sprachen lediglich dazu, das implementieren von Methoden zu erzwingen.
        Ein Interface enthält also nur Signaturen von Methoden und nicht die Implementierung an sich. Wenn man Objekte miteinander kommunizieren lassen möchte, sind Interfaces also ziemlich sinnvoll.
        Wie das in PHP ist, weiß ich nicht, da ich grundsätzlich in Java programmiere.
        Hab aber gelesen, dass Interfaces in PHP aufgrund der automatischen Typkonvertierung relativ sinnfrei sein sollen.

        Kommentar


        • #5
          Weil das muss man doch nicht bei JEDER Klasse machen, nur dass sichergestellt ist, dass die Implementierung entkoppelt ist. Oder was sagst du dazu.
          Unverständlich.
          OOP in PHP finde ich eigentlich ziemlich unnötig, wenn ihr mich fragt.
          Ja. Tun wir aber nicht.
          Ein Interface enthält also nur Signaturen von Methoden und nicht die Implementierung an sich. Wenn man Objekte miteinander kommunizieren lassen möchte, sind Interfaces also ziemlich sinnvoll.
          Wie das in PHP ist, weiß ich nicht, da ich grundsätzlich in Java programmiere.
          in richtigen OOP-Sprachen
          Mit Verlaub - nie mit gearbeitet, aber sich erst mal dran abarbeiten.

          Hab aber gelesen, dass Interfaces in PHP aufgrund der automatischen Typkonvertierung relativ sinnfrei sein sollen.
          Again:
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Zitat von Phpyton Beitrag anzeigen
            Setzt du also Interfaces nur für Typehinting ein. Weil das muss man doch nicht bei JEDER Klasse machen, nur dass sichergestellt ist, dass die Implementierung entkoppelt ist. Oder was sagst du dazu.
            In Summe, ja. Grundsätzlich wenn ich etwas vorgeben will, das ( egal wie man es dreht ) nicht an eine Klasse gebunden sein soll.

            Zitat von Raildex Beitrag anzeigen
            OOP in PHP finde ich eigentlich ziemlich unnötig, wenn ihr mich fragt.

            Interfaces dienen in richtigen OOP-Sprachen lediglich dazu, das implementieren von Methoden zu erzwingen.
            Ein Interface enthält also nur Signaturen von Methoden und nicht die Implementierung an sich. Wenn man Objekte miteinander kommunizieren lassen möchte, sind Interfaces also ziemlich sinnvoll.
            Wie das in PHP ist, weiß ich nicht, da ich grundsätzlich in Java programmiere.
            Hab aber gelesen, dass Interfaces in PHP aufgrund der automatischen Typkonvertierung relativ sinnfrei sein sollen.
            Interfaces sind von auto-typecasting nicht betroffen.

            Interfaces dienen in allen Sprachen dazu Vorgaben zu machen. Ob das nun Methoden oder Konstanten sind ( in PHP ) oder das Gruppieren mehrer Interfaces zu einem. Es gibt außerdem noch eine (un-)art von Interfaces ( was aber nicht bedeutet das sie worst practice sind ): Marker-Interfaces; die definieren genau 0 Methoden und 0 Konstanten.
            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

            Kommentar


            • #7
              @raildex
              Wenn du nur provozieren willst: Ich glaube nicht, dass dies ein sinnvoller Weg ist eine interessante Diskussion zu starten.
              Solltest du wirklich dieser Meinung anhängen: Änder' sie.
              Standards - Best Practices - AwesomePHP - Guideline für WebApps

              Kommentar


              • #8
                Zitat von rkr Beitrag anzeigen
                @raildex
                Wenn du nur provozieren willst: Ich glaube nicht, dass dies ein sinnvoller Weg ist eine interessante Diskussion zu starten.
                Solltest du wirklich dieser Meinung anhängen: Änder' sie.
                Unterschreibe ich so.
                [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                Kommentar


                • #9
                  Zitat von rkr Beitrag anzeigen
                  @raildex
                  Wenn du nur provozieren willst: Ich glaube nicht, dass dies ein sinnvoller Weg ist eine interessante Diskussion zu starten.
                  Solltest du wirklich dieser Meinung anhängen: Änder' sie.
                  Provozieren war nicht meine Absicht. Ich bin PHP-Anfänger, falls man mir das nicht anmerkt und schreibe damit auch erst seit kurzem. Bin kein Profi, hab ich nirgends behauptet. Ich hab lediglich geschrieben, dass ich auch in Java programmiere und Interfaces von dort kenne.
                  Ich kann mir im entferntesten auch nicht vorstellen, wo da 'ne Provokation drin sein soll.

                  Kommentar


                  • #10
                    Zitat von Raildex Beitrag anzeigen
                    Interfaces dienen in richtigen OOP-Sprachen lediglich...
                    Welche PHP-Version verwendest du? 4?

                    Gewöhn dir einfach an mit Interfaces zu arbeiten. Es ist (fast) überall sinnvoll, wo eine Klasse mit einer anderen zu tun hat. Wenn du noch keine Erfahrung damit hast dann probier einfach eines einzusetzen, und schau ob/welche Vorteile es bringt. Du wirst sehen es bringt vielfach Vorteile und kaum Nachteile, abgesehen davon das man das Gefühl hat alles doppelt zu machen.

                    Kommentar


                    • #11
                      Du bewertest die OOP-zentrik von PHP als Müll ( also das was PHP im moment unter "thats it!" versteht ), das ist schon irgendwo provozierend in einem PHP-Forum, auch stellst du PHP als unrichtige OOP-Sprache hin ( sowas gibts nicht.. ).
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        Ich hatte in einem Buch gelesen, dass Interfaces sinnvoll sind, um zu sehen, welche Methoden eine Klasse bereitstellt. Aber das sehe ich doch genauso, wenn ich in die Klasse sehe und dann alle public Methoden sehe. Stellt sich nur die Frage, wie weit die Entkopplung gehen soll. Immer, wenn eine Klasse, oder die Anwendung Methoden der Klasse benötigt, also von aussen darauf zugreift?

                        Kommentar


                        • #13
                          Wenn das in dem Buch wirklich sinngemäß so steht, würde ich das Buch entsorgen.
                          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                          Kommentar


                          • #14
                            Steht so drin. Vielleicht ist das ein zu starkes Anfängerbuch. Dank deiner Erklärung hab ichs, denk ich, verstanden.

                            Kommentar


                            • #15
                              Wieso, das Buch hat doch recht. Das Interface einer Klasse sind ja nur dessen Methoden (und öffentliche Eigenschaften). Eine Klasse kann ja auch als Typehint verwendet werden. Dabei zählen nur dessen Methoden (ok, etwas anders ist es da schon).

                              Ein Interface (als OO-Baustein) beschreibt, was eine Klasse mindestens implementieren muss, damit eine beliebige eine konsumierende Klasse damit arbeiten kann. Beispiel:

                              PHP-Code:
                              <?php
                              interface FileSystem {
                                  
                              /**
                                   * @param string $parentDirectory
                                   * @return string[]
                                   */
                                  
                              public function listDirectories($parentDirectory);

                                  
                              /**
                                   * @param string $parentDirectory
                                   * @return string[]
                                   */
                                  
                              public function listFiles($parentDirectory);
                              }
                              PHP-Code:
                              class BuildDirectoryTree {
                                  
                              /**
                                   * @param FileSystem $fs
                                   * @param $parentDirectory
                                   * @return array[]
                                   */
                                  
                              public function crawl(FileSystem $fs$parentDirectory) {
                                      
                              $result = array();
                                      
                              $parentDirectory str_replace('\\''/'$parentDirectory);
                                      
                              $directories $fs->listDirectories($parentDirectory);
                                      foreach(
                              $directories as $directory) {
                                          
                              $result += $this->crawl($fs$result[] = $this->concat($parentDirectory$directory));
                                      }
                                      
                              $files $fs->listFiles($parentDirectory);
                                      foreach(
                              $files as $file) {
                                          
                              $result[] = $this->concat($parentDirectory$file);
                                      }
                                      return 
                              $result;
                                  }

                                  
                              /**
                                   * @param string $a
                                   * @param string $b
                                   * @return string
                                   */
                                  
                              private function concat($a$b) {
                                      return 
                              rtrim($a'/') . '/' ltrim($b'/');
                                  }

                              FileSystem? Kann alles sein. Lokale HDD, SFTP, FTP(S), WebDAV, Mock, Starwars, who cares as long as it serves what it should.

                              Und immer schön Lizkov, wa?
                              Standards - Best Practices - AwesomePHP - Guideline für WebApps

                              Kommentar

                              Lädt...
                              X