Ankündigung

Einklappen
Keine Ankündigung bisher.

SPL Grundliegendes

Einklappen

Neue Werbung 2019

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

  • SPL Grundliegendes

    Hallo und schönen guten Morgen,

    Ich habe eine Frage bezüglich der SPL,

    "wie schafft man es mit einem Interface auf eine Funktion wie Count zu reagieren oder ein Objekt fast wie ein Array zu behandeln?"

    Bitte nicht falsch verstehen, ich möchte kein Codebeispiel, sondern lediglich verstehen wie ein Interface in der Lage ist sowas zu steuern. Oder handelt es sich hier um kein wirkliches Interface welches ich nachentwickeln könnte um z.B. auf andere Funktionen zu reagieren ?

    Besten Gruß, Tim

  • #2
    Was meinst du mit "mit einem Interface reagieren"? Ein Interface legt nur fest, welche Methoden in einer Klasse implementiert sein müssen. Zum SPL im Allgemeinen gibt es im Manual sehr gute Erklärungen.
    MfG, Andy

    Kommentar


    • #3
      Du bist nicht in der Lage ein solches Interface mit PHP zu nachzuprogrammieren, da steckt noch mehr dahinter als bloß die Festlegung der Methoden.

      Kommentar


      • #4
        ja, dass dachte ich mir,

        war etwas verwirrt als ich gelesen hatte, dass dies so ohne weiteres möglich sei.
        ich frage mal ganz vorsichtig,

        wo der tiefere sinn und zweck darin liegt, dass man dies über ein interface regelt ?
        Versucht man hier nicht Birnen und Äpfel in einen Topf zu stecken ?


        Besten Gruß, Tim

        Kommentar


        • #5
          Zitat von notyyy Beitrag anzeigen
          wo der tiefere sinn und zweck darin liegt, dass man dies über ein interface regelt ?
          Versucht man hier nicht Birnen und Äpfel in einen Topf zu stecken ?
          das interface regelt, das um eine bestimmte funktionalität zu nutzen, bestimmte methoden vorhanden sein sollen.
          wenn du also count($object) benutzen willst, muss $object die methode count implementieren. dies wird über das interface geprüft. wo ist also dein problem?

          Kommentar


          • #6
            Nimm z.b. das Iterator-Pattern. Für dieses Pattern definierst du ein Interface, in dem die Methoden festgelegt werden. Wie diese Methoden arbeiten ist der jeweiligen Klasse überlassen. Wichtig ist nur, dass sich der Rest der Welt darauf verlassen kann, dass bestimmte Methoden genutzt werden können.
            Das ist der eine Grund. Die SPL muss wissen, auf welche Methoden sie zugreifen kann um bestimmte Sachen wie z.B. den Iterator bereitzustellen. Dass die SPL damit noch weitere Funktionalität verknüpft ist eine andere Sache.
            Der zweite Grund ist schlicht und ergreifend der, dass es irgendeine Möglichkeit geben muss, PHP mitzuteilen, dass diese Klasse Funktionalitäten der SPL nutzt ohne dabei irgendwelchen syntaktischen Unsinn zu bauen. Also hat man Interfaces benutzt. Man hätte auch abstrakte Klassen nehmen können, aber das hätte den Nachteil gehabt, dass die Klasse dann nicht mehr von anderen Klassen erben kann.

            Kommentar


            • #7
              PHP-Code:
              class test implements Countable
              {
                  public function 
              count()
                  {
                      return 
              5;
                  }
              }
              $test = new test;
              echo 
              count($test); 
              Ich hätte eine solche Funktionalität nicht hinter einem Interface vermutet, zumal ich im sinne der oop nicht ganz verstehe warum man ein so mächtiges werkzeug auf schleifen (count, pseudo Arrays u.s.w.) beschränkt und nicht allgemeingültig macht.

              Kommentar


              • #8
                Zitat von notyyy Beitrag anzeigen
                Ich hätte eine solche Funktionalität nicht hinter einem Interface vermutet, zumal ich im sinne der oop nicht ganz verstehe warum man ein so mächtiges werkzeug auf schleifen (count, pseudo Arrays u.s.w.) beschränkt und nicht allgemeingültig macht.
                Meinst Du damit einen Mechanismus, der immer dann eine Methode aufruft, wenn das Objekt Parameter einer Funktion/Methode ist?

                Kommentar


                • #9
                  Zitat von notyyy Beitrag anzeigen
                  Ich hätte eine solche Funktionalität nicht hinter einem Interface vermutet, zumal ich im sinne der oop nicht ganz verstehe warum man ein so mächtiges werkzeug auf schleifen (count, pseudo Arrays u.s.w.) beschränkt und nicht allgemeingültig macht.
                  Hä? Das Interface hat doch nur die Funktion zu sagen die Klasse besitzt bestimmte Eigenschaften. Die eigentliche Funktionalität steckt in count() selbst, das kann man sich dann ungefähr so vorstellen:

                  PHP-Code:
                  function count($data) {
                      if(
                  is_array($data)) return array_count($data);
                      if(
                  is_string($data)) return strlen($data);
                      if(
                  $data instantsof Countable)) return $data->count();
                      return 
                  false;

                  Es hindert dich ja keiner dran so etwas selbst zu implementieren.

                  Kommentar


                  • #10
                    Zitat von notyyy Beitrag anzeigen
                    Hallo und schönen guten Morgen,

                    Ich habe eine Frage bezüglich der SPL,

                    "wie schafft man es mit einem Interface auf eine Funktion wie Count zu reagieren oder ein Objekt fast wie ein Array zu behandeln?"

                    Bitte nicht falsch verstehen, ich möchte kein Codebeispiel, sondern lediglich verstehen wie ein Interface in der Lage ist sowas zu steuern. Oder handelt es sich hier um kein wirkliches Interface welches ich nachentwickeln könnte um z.B. auf andere Funktionen zu reagieren ?

                    Besten Gruß, Tim
                    Wenn du ein Interface in der Klassendeklaration mit implements einbindest, garantiert der Parser, dass die im Interface vorgeschriebenen Methoden auch in den Klasse existieren, die dieses einbinden. Andernfalls wird ein Fehler geworfen und das Skript beendet. Ich bin nicht sicher ob dir das soweit klar war.

                    Bindest du nun SPL-Interfaces wie z.B. Countable
                    PHP: Countable - Manual
                    ein, kannst du Instanzen dieser Klasse (also Objekte) an count() übergeben und DEINE Implementierung der Methode count() der Klasse wird nun von der Funktion count() dafür verwendet, den Rückgabewert zu ermitteln.

                    Beantwortet das deine Frage?

                    Ich hätte eine solche Funktionalität nicht hinter einem Interface vermutet
                    Interfaces haben keine Funktionalität, sie definieren lediglich die Schnittstellen, implementieren musst du wie erwähnt das ganze selbst.


                    zumal ich im sinne der oop nicht ganz verstehe warum man ein so mächtiges werkzeug auf schleifen (count, pseudo Arrays u.s.w.) beschränkt und nicht allgemeingültig macht.
                    Für was sollte man es denn erweitern?

                    Kommentar


                    • #11
                      Ich finde die PHP mitgelieferten Intefaces doof, weil sie einen ganz anderen Sinn haben als echte die Interfaces, die man selbst erstellen kann.
                      PHP5 OOP Interfaces | UGamela Blog
                      <- Ein Artikel den ich geschrieben habe als ich Interfaces verstanden habe.

                      Sie mal von den vorgegeben Interfaces ab und hör dir das an:
                      Hast du mal mit Objecttypehints gearbeitet?
                      PHP-Code:
                      function blubbBlubber $blubber)
                      {
                          
                      # [...]

                      Anstatt nur Objekte einer bestimmten Klasse zuzulassen, kannst du auch nur ein bestimmtes Interface zulassen, wenn du vor hast dessen Methoden zu verwenden. Dann können alle Klassen die dieses Interface implementieren dort eingesetzt werden. Mit "Schnittstelle" ist also die Fähigkeit etwas bestimmtes zu tun gemeint.
                      Verwendest du Autovervollständigung? Dann kannst du auch dort einen Typehint auf das Interface verwenden. Ich habe mir dann auch Mühe erspart und nur das Interface dokumentiert.
                      Beispiel Datenbankabstraktion:
                      Du möchtest verschiedene Datenbanktypen (& -klassen) zulassen, dennoch soll der Code einheitlich sein. [Sehen wir jetzt mal von PDO ab, das stellt quasi das da, was ich erklären werde, nur mit Interface]
                      Du erweiterst und oder dekorierst eine Datenbankklasse (zB mysql oder mysqli), passt sie auf das Interface, das du entworfen hast an. Nun ist quasi das Interface deine Datenbankklasse, du kannst andere Datenbanktypen auf das Interface anpassen und genauso verwenden.

                      Zurück zu den PHP Interfaces: Eigentlich machen sie tatsächlich das selbe wie ein normales Interface, dennoch ist die Verwendung sehr konkret.

                      Kommentar


                      • #12
                        Zitat von Phlegma Beitrag anzeigen
                        Ich finde die PHP mitgelieferten Intefaces doof, weil sie einen ganz anderen Sinn haben als echte die Interfaces, die man selbst erstellen kann.
                        und doch nimmst du in deinem beitrag bezug auf interne schnittstellen. über den tieferen sinn brauche ich nichts weiter zu schreiben, siehe meinen 1. beitrag und den von chriz.

                        PHP5 OOP Interfaces | UGamela Blog
                        <- Ein Artikel den ich geschrieben habe als ich Interfaces verstanden habe.
                        sorry, aber der artikel sagt nichts darüber was ein interface ist. und schnittstelle ist ein perfektes wort, für das was getan wird. es wird geregelt wie ich mit dieser klasse rede, das heißt ich kann 100.000 klassen haben und wenn alle dieses interface implementieren kann es mir schnurzpiepegal sein was diese klassen tun, ich kann mit ihnen reden.

                        Sie mal von den vorgegeben Interfaces ab und hör dir das an:
                        Hast du mal mit Objecttypehints gearbeitet?
                        PHP-Code:
                        function blubbBlubber $blubber)
                        {
                            
                        # [...]

                        Anstatt nur Objekte einer bestimmten Klasse zuzulassen, kannst du auch nur ein bestimmtes Interface zulassen, wenn du vor hast dessen Methoden zu verwenden. Dann können alle Klassen die dieses Interface implementieren dort eingesetzt werden. Mit "Schnittstelle" ist also die Fähigkeit etwas bestimmtes zu tun gemeint.
                        das geht doch mehr in die richtige richtung.

                        Verwendest du Autovervollständigung? Dann kannst du auch dort einen Typehint auf das Interface verwenden. Ich habe mir dann auch Mühe erspart und nur das Interface dokumentiert.
                        Beispiel Datenbankabstraktion:
                        Du möchtest verschiedene Datenbanktypen (& -klassen) zulassen, dennoch soll der Code einheitlich sein. [Sehen wir jetzt mal von PDO ab, das stellt quasi das da, was ich erklären werde, nur mit Interface]
                        Du erweiterst und oder dekorierst eine Datenbankklasse (zB mysql oder mysqli), passt sie auf das Interface, das du entworfen hast an. Nun ist quasi das Interface deine Datenbankklasse, du kannst andere Datenbanktypen auf das Interface anpassen und genauso verwenden.
                        für mich viel klarer war das active record pattern
                        ich denke es ist klar, wie schön man damit ein db interface für jedwege datenbank gut implementieren kann.

                        Zurück zu den PHP Interfaces: Eigentlich machen sie tatsächlich das selbe wie ein normales Interface, dennoch ist die Verwendung sehr konkret.
                        sie sind ein normales interface.....siehe meinen 1. post und den von chriz.

                        Kommentar


                        • #13
                          Ich habe versucht meinen Verständnisweg nachzugehen. Alle Wege führen nach Rom. Vllt bist du einen anderen gegangen. Fest steht, dass die PHP vorgegeben Interfaces schlecht als Vorbild für andere Interfaces zu nehmen sind.
                          Ich finde zudem, dass der Name "Schnittstellen" auf den ersten Blick ganz andere Ideen erzeugt.

                          Kommentar


                          • #14
                            Zitat von Phlegma Beitrag anzeigen
                            Fest steht, dass die PHP vorgegeben Interfaces schlecht als Vorbild für andere Interfaces zu nehmen sind.
                            Ich finde zudem, dass der Name "Schnittstellen" auf den ersten Blick ganz andere Ideen erzeugt.
                            Im Artikel verwendest Du die Iterator-Schnittstelle als Beispiel für von PHP gelieferte Schnittstellen. Das ist doch eine der "klassischen" Beispielschnittstellen, die Du fast überall findest. Also die Kritik verstehe ich leider überhaupt nicht.
                            Auch nicht, was an Deiner Datenzugriff-Schnittstelle abstrakter sein soll.

                            Kommentar


                            • #15
                              PHP liefert Syntax Interfaces, was ich sehr hübsch finde, dennoch nenne ich sie konkret. Mit abstrakt meine ich dann eher eine logische Verwendung, wie eben der Datenbank Kram

                              Kommentar

                              Lädt...
                              X