Ankündigung

Einklappen
Keine Ankündigung bisher.

Interfaces in PHP5 -aber wie?

Einklappen

Neue Werbung 2019

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

  • Interfaces in PHP5 -aber wie?

    Hallo Leute!

    Ich hab da ein kleines Problem. Als ich wollt polymorphes Verhalten über ein Interface realisieren. Also ich wollt ein Interface ansprechen und das entscheidet dann, je nachdem wie der dynamische Typ ist welche Memberfunktion (also von welcher Klasse) ausgeführt werden muss. Ich hatte dass noch so in Erinnerung von einen kleinen ABAP Einführungskurs.

    PHP-Code:
    interface iFahrzeug 
    public function 
    ichBin() ; 


    class 
    auto 
    public function 
    ichBin() { 
    echo 
    " ein Auto"



    class 
    bus 
    public function 
    ichBin() { 
    echo 
    " ein Bus"



    $fahrzeug = new iFahrzeug(); 

    $auto = new auto(); 
    $bus = new bus(); 

    echo 
    "Ich bin".$auto->ichBin(); 
    //Sollte "Ich bin ein Auto" ausgeben 
    echo "Ich bin".$bus->ichBin(); 
    //Sollte "Ich bin ein Bus" ausgeben 

    $fahrzeug $auto

    echo 
    "Ich bin".$fahrzeug->ichBin(); 
    //Sollte nach meiner Ansicht nach wie eine Auto-Instanz verhalten, tut es aber nicht!! 
    Es gibt mir einen Fatal Error "Cannot instantiate interface " aus.

    Geht sowas nicht bei PHP oder bin ich einfach nur zu blöd?
    Ist in PHP das Interface also vll nur dazu da das man weiß dass Klassen die ein Interface implementieren auch die im Interface deklarierten Methoden hat?
    Ist es am Ende nur eine informelle Schnittstelle die man nicht nutzen kann??

    Danke shcon mal für die Antworten!!

    greetz rafug


  • #2
    Du kannst keine Instanz eines Interface anlegen. Eine Klasse implementiert ein Interface. class xyz implements myInterface

    PHP-Code:
    <?php
    interface iFahrzeug {
        public function 
    ichBin() ;
    }

    class 
    auto implements iFahrzeug {
        public function 
    ichBin() {
            echo 
    " ein Auto";
        }
    }

    class 
    bus implements iFahrzeug {
        public function 
    ichBin() {
            echo 
    " ein Bus";
        }
    }

    function 
    foo(iFahrzeug $fahrzeug) {
      echo 
    "Ich bin".$fahrzeug->ichBin();
    }

    $auto = new auto();
    $bus = new bus();

    foo($auto);
    foo($bus);

    Kommentar


    • #3
      also muss ich den "Umweg" über eine Funktion machen um sowas zu realisieren? ich kann mir also keine Variable mit dem Typ IFahrzeug definieren, also wie in der funktion "IFahrzeug $fahrzeug"?

      also mir ist schon klar das ich in php genrell schlecht Variablentypen anlegen kann

      Aber ich dachte mir über so eine "Interface-Instanz" gehts vll, aber anscheinedn nicht.

      Kommentar


      • #4
        Du kannst generell von Interfaces genau wie von abstrakten Klassen kein Objekt ableiten. Interfaces müssen implementiert und abstrakte Klassen beerbt werden.
        Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

        Kommentar


        • #5
          Hi,

          Das was du möchtest funktioniert so:

          PHP-Code:
          interface iFahrzeug 
          public function 
          ichBin() ; 


          class 
          auto implements iFahrzeug
          public function 
          ichBin() { 
          echo 
          " ein Auto"



          class 
          bus implements iFahrzeug
          public function 
          ichBin() { 
          echo 
          " ein Bus"



          $fahrzeug = new Bus();  
          echo 
          "Ich bin".$fahrzeug->ichBin(); 
          Gruß Thomas

          Kommentar


          • #6
            Zitat von rafug Beitrag anzeigen
            ich kann mir also keine Variable mit dem Typ IFahrzeug definieren, also wie in der funktion "IFahrzeug $fahrzeug"?
            type hinting gibt es nur für Funktionen/Methoden. Variablen kannst Du immer alle möglichen Typen zuweisen. Du kannst aber abfragen, ob ein Objekt ein bestimmtes Interface implementiert.
            PHP-Code:
            <?php
            interface iFahrzeug {
              public function 
            ichBin() ;
            }

            class 
            Auto implements iFahrzeug {
              public function 
            ichBin() {
                echo 
            " ein Auto";
              }
            }

            class 
            Kürbis {
              public function 
            ichBin() {
                echo 
            " ein Kürbis";
              }
            }

            foreach(array(new 
            Auto, new Kürbis) as $obj)
            {
              echo 
            get_class($obj), ': ';
              if (
            $obj instanceof iFahrzeug)
              {
                
            $obj->ichBin();
              }
              else
              {
                echo 
            '-kein Fahrzeug-';
              }
              echo 
            " \n";
            }

            Kommentar


            • #7
              Ich weiss nicht, welche Art von Interface dir vorschwebt. Aber die von Java verhalten sich z.B. genau so.

              Ein Interface ist eine zugesicherte Eigenschaft einer Klasse. Das was du beschreibst ist eher das Verhalten einer übergeordneten Klasse.

              Kommentar


              • #8
                Hmm, ich bin mir net sicher, aber ich würde das als Factory realisieren.

                Kommentar


                • #9
                  Bitte beachten, dass Interfaces und Klassen, ebenso wie Vererbung syntaktische Elemente der Sprache sind. Design Patterns wie eine Factory sind dagegen strukturelle Elemente eines Programms.

                  Gerade wenn jemand es schon syntaktisch nicht zum Laufen bringt, sollte man nicht zur Verwirrung beitragen, in dem man das durcheinander wirft.

                  Kommentar


                  • #10
                    sicherlich hast du damit nicht unrecht. Man könnte das logischerweise auch echt noch weiterspinnen um das Ergebnis bzw. die Bedienbarkeit zu erhöhen.

                    Ganz einfach erklärt, ist ein Interface wie ein Protokoll. Das Interface schreibt nicht vor wie sich das Objekt verhalten soll. Es schreibt die Art vor wie die Aussenwelt mit dem Objekt kommuniziert.

                    Ein Interface zu definieren bedeutet festzulegen wie dein Code mit jedem Objekt welches deieses Interface implementiert zu kommunizieren hat.

                    Eine Abstrakte Klasse ist hingegen wie eine teilweise vollständige Klasse. Sie ähnelt sehr einem Formular in dem dir im Vorfeld definierte Möglichkeiten zur Verfügung gestellt werden um die "Felder" auszufüllen.

                    Ein Interface ist wie eine Versprechen deiner Klassen welche das Interface implementieren:
                    "Ich verspreche die gleichen öffentlichen Funktionen zu besitzen wie alle Klassen die dieses Interface implementieren.

                    Die Verwendung einer abstrakten Klasse sagt hingegen "nur" aus:
                    Ich benutze einige Methoden und Eigenschaften welche bereits in der Abstrakten Klasse definiert wurden.

                    Kommentar

                    Lädt...
                    X