Gibt es Polymorphie auch in PHP ?

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

  • Gibt es Polymorphie auch in PHP ?

    Hallo Leute,

    kann ich eigentlich in PHP wie auch in C++ Funktionen überschreiben ?
    Ich habe in meiner Root-Klasse eine Funktion die ich so eigentlich für jedes vererbte Klasse benötige....nur bei ein oder zwei benötige ich eine leicht abgeänderte Funktion.
    So, jetzt könnte ich das irgendwie lösen, am saubersten wäre natürlich das ich diese Funktion überschreibe. Ist das in PHP auch möglich wie in C++ ? Wenn ja, wie ?

    C++ und PHP ähneln sich ja ziemlich, daher würde mich das nun wundern wenn das nicht gehen würde.....aber in Google ist dieses Thema sehr dünn besiedelt......wenn sogar nahezu gar nicht oder ungenau.....

  • #2
    sorry!
    warum so viel schreiben?
    warum so viel in google nachschauen?
    du kannst doch das mit 5 zeilen testen!!!
    ok ich mache das für dich
    PHP-Code:
    class A{
    function 
    af(){echo"af aus A";}
    }

    class 
    extends A{
     function 
    af(){echo"af aus B ruft "parent::af();}
    }

    $ding=new B;
    $ding->af(); 
    kopieren und einfügen muss du selber
    Slava
    bituniverse.com

    Kommentar


    • #3
      Danke du Schlaumeier....und das war natürlich lieb gemeint

      Woher soll ich wissen das da ein
      PHP-Code:
      parent::Funktionsname() 
      nach der Funktion kommt ?
      In C++ erstelle ich eben nur eine neue Funktion mit gleichem Namen soweit ich mich noch erinnern kann.......

      Falls das so nicht stimmt so enschuldige ich mich und bezeichne mich bis Weihnachten täglich mindestens 10x als Schlaumeier....

      Und genau das habe ich so ausprobiert mit negativem Ergebnis.....daher auch Google und hier Fragen....was mir natürlcih wiedereinmal weiter geholfen hat.....

      Also danke dir!

      Kommentar


      • #4
        Original geschrieben von Master0Blicker
        Woher soll ich wissen das da ein
        PHP-Code:
        parent::Funktionsname() 
        nach der Funktion kommt ?
        In C++ erstelle ich eben nur eine neue Funktion mit gleichem Namen soweit ich mich noch erinnern kann.......
        In PHP auch...

        parent::funktionsname() brauchst du nur, um auch die Methode der übergeordneten Klasse aufrufen zu können, falls erforderlich
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          Original geschrieben von Master0Blicker
          Und genau das habe ich so ausprobiert mit negativem Ergebnis.....daher auch Google und hier Fragen....was mir natürlcih wiedereinmal weiter geholfen hat.....
          Wie sah denn der versuch aus ? Hatte deine methode
          die exakt gleiche signatur wie die der elternklasse ?
          Wie man methoden von elternklassen überschreibt weisst du ja
          jetzt.

          Noch ein wort zum overloading in php generell.
          Es ist in php nicht mit sprachmitteln möglich methoden zu
          überladen wie man es aus anderen sprachen kennt, in dem
          man die signatur ändert.

          PHP-Code:
          class foo{
                public function 
          bar($var){}
                public function 
          bar($var,$var2){}

          Sowas funktioniert leider nicht. Man kann sich zwar behelfen
          aber das ist dann eben kein out-of-the-box-support mehr.

          greets
          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

          Kommentar


          • #6
            jo das überschreiben von methoden wäre wirklich wünschenswert bei php. ich behelfe mir entweder indem ich die maximale anzahl von parametern angebe und einfach alle nicht benötigten bei der parameter angabe leer lasse oder null angebe. in ner if abfrage in der methode selbst wird dann überprüft was er machen soll

            oder die simplere methode einfach mehr methoden deklarieren und denen eigene namen geben wie

            GetUserByID
            GetUserByName

            aber solangsam sollten die wirklich mal das überschreiben einführn

            Kommentar


            • #7
              Hi,

              man kann overloading faken mittels

              func_num_args
              func_get_args
              func_get_arg

              aber wie gesagt, das ist nicht so schön.
              (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

              Kommentar


              • #8
                Ach stimmt...hatte vergessen zu erwähnen das ich die Paramter bzw. Signatur ändern wollte...

                also

                Code:
                function funk($var1){.....};
                wollte ich überschreiben mit

                Code:
                function funk($var1, $var2){...}:

                Ich wollte auch verschiedene Konstruktoren erstellen für eine Klasse jeweils mit verschiedenen 'signaturen' bzw. Parametern...in C++ auch üblich.... ging auch nicht......


                Also :

                Code:
                function classname(){...};
                
                function classname($var1){...};

                Ging auch nicht..........


                P.S. leigts nun an mir ? Muss ich jeden Tag bis Jahresende 10x 'Ich bin ein Schlaumeier sagen ?

                Kommentar


                • #9
                  Hi,

                  du kannst im prinzip so ziemlich alles was du über c++ weisst
                  vergessen wenn du php programmierst. Viele dinge funktionieren
                  einfach anders. Ich habe die selbe erfahrung machen müssen.
                  Besonders grausam wurde es als um referenzen in php ging.

                  Also kurzum, man kann methoden in php nicht auf diese weise
                  überladen. Der ctor ist auch eine methode geht also ebenfalls
                  nicht.

                  greets
                  und viel spaß im grausamen land der hebräischen fehlermeldungen
                  und der unendlichen inkonsistenz, kurzum: Welcome to PHP
                  Zuletzt geändert von closure; 26.04.2006, 13:13.
                  (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                  Kommentar


                  • #10
                    du kannst im prinzip so ziemlich alles was du über c++ weisst
                    vergessen wenn du php programmierst. Viele dinge funktionieren
                    einfach anders. Ich habe die selbe erfahrung machen müssen.
                    Besonders grausam wurde es als um referenzen in php ging.
                    genau so ist es! Keine polymorphie, kein operatoren überladen, keine funktionen überladen, nur ein konstruktor.....

                    Aber dafür fallen die Typen in PHP komplett vom Programmierer weg und insgesamt ist php eine um einiges einfachere Sprache als c++. Nur müssen wir dafür leider auf so einiges verzichten....

                    Kommentar


                    • #11
                      Aber die Möglichkeit besteht trotzdem das das in zukünftigen PHP-Versionen alles umgesetzt wird, oder ?

                      Denn die Vorteile von PHP kombiniert mit allen Vorteilen von C++ wäre doch genial........

                      Keine Variablendeklarationen, oder z.B. ziemlich lockerer Umgang mit Fehlern (wie ich bemerkt habe), usw... mit allen Möglichkeiten von C++ wie Klassen, Vererbung, dann noch die Möglichkeit Funktionen überladen usw.....


                      Aber meine 2. Frage hab ich noch nicht beantwortet bekommen (vielleicht untergegangen oder nicht richtig gefragt):

                      Kann ich in PHP wie auch in C++ verschieden Konstruktoren für eine Klasse benutzen nur mit unterschiedlichen Parameterübergaben ?

                      Also wenn ich keine Parameter übergebe dann Konstruktor()....wenn ich einen entsprechenden Parameter übergebe dann Konstruktor($var1).....usw ?
                      In C++ geht das ja prima.....

                      Kommentar


                      • #12
                        Hi,

                        in einem nebensatz habe ich gesagt dass der ctor in php
                        auch nur eine methode ist und methoden können in php
                        nicht auf die in c++ gewohnte weise überladen werden.
                        Daraus folgt => Nein , es geht nicht out-of-the-box.
                        Man kann die von mir genannten funktionen für sowas nehmen
                        und dann an private init-methoden weiterleiten.

                        Zum ersten teil:
                        Nein, es ist sehr unwahrscheinlich dass das alles in php kommen
                        wird. Ich hab irgendwo mal die meinung der zend-leute zu dem
                        thema gelesen und die wollen die meisten features , die c++-programmierer
                        vermisssen gar nicht.

                        Ich weiss nicht in wieweit du dich mit php5 auseinander gesetzt hast,
                        aber da sind ein paar sachen die man sich wünscht schon realisiert.

                        Es ist sogar möglich den operator-[] zu überladen. Leider ist
                        das auch der einzige operator den man überladen kann.

                        PHP tickt anders als c++, ganz klar, es ist auch für eine
                        völlig anderen problemdomäne entwickelt worden.


                        greets
                        (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                        Kommentar


                        • #13
                          Original geschrieben von closure

                          Zum ersten teil:
                          Nein, es ist sehr unwahrscheinlich dass das alles in php kommen
                          wird. Ich hab irgendwo mal die meinung der zend-leute zu dem
                          thema gelesen und die wollen die meisten features , die c++-programmierer
                          vermisssen gar nicht.
                          Joa, so ist es wohl , nur hat man auch manchmal den Eindruck, dass sie auch Sachen machen, die sie, oder manche von ihnen, nicht wollen.
                          Letzendlich scheint es mir, und ich bin alles andere als ein experte in Sachen php,
                          als ob sie für die Dinge die sie aus C++, oder auch anderen echten OO-Sprachen,
                          nicht wollen, eine Art Kompromiss-addon einflicken.
                          So kam es mir bisher vor und auch das Protokoll des Meetings aus Paris, im November ( bzgl php6 ) scheint auch keine Änderung daran anzukündigen.
                          So merkt man doch irgendwie den Mangel an Erfahrung der Entwickler, wenn
                          man die Vorschläge, Diskussionen und die dann letzendlichen Zusammenfassungen betrachtet..
                          Es werden wohl weiterhin OO-Features hinzugefügt, andere nicht und alte "fehler" der Sprache immer weiter als Deprecated deklariert, denn löschen wollen sie sorecht nichts..

                          Naja , ich weiss ja auch nicht ob es ein neueres Meeting der Zend Leute gab, in dem Dinge beschlossen wurden ( bzw die Planung dieser Dinge ), aber
                          mit meinem Stand kann ich closure nur zustimmen und werd mich damit abfinden, dass ich mit php bestimmte schöne dinge nicht machen werden kann.

                          Kommentar


                          • #14
                            Original geschrieben von shapeless
                            [...] und alte "fehler" der Sprache immer weiter als Deprecated deklariert, denn löschen wollen sie sorecht nichts..
                            Ist ja auch verständlich - denn dann wären für viele Scripte Anpassungen erforderlich, wenn auf eine neue Version upgedatet wird.

                            Und wie viele Leute einfach nur "Anwender" fertiger Scripte sind, ohne jegliche Ahnung, sieht man ja hier tagtäglich. Und die würden dann ziemlich in die Röhre schauen, wenn ihr Provider neurere PHP-Versionen nutzt.

                            Andersherum können genügend solcher Anwender auch entsprechend Druck auf ihren Provider ausüben - dann verkehrt sich das ganze letztendlich in den Effekt, dass die Provider eben keine PHP-Updates mehr vornehmen - wäre auch Mist.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              amogus

                              [FONT=Comic Sans MS][COLOR=Magenta]s[/COLOR]u[COLOR=magenta]s[/COLOR][/FONT]

                              Kommentar

                              Lädt...
                              X