Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Komisches Verhalten von $this bei Vererbung

Einklappen

Neue Werbung 2019

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

  • #16
    Zitat von Squall Beitrag anzeigen
    Dazu kann ich nur sagen das mein Chef mir auch schon über die Schulter geschaut hat während ich im Forum war. Ich erklärte Ihm dass ich öfter mal in dem Forum Hilfe Suche und auch bekomme. Und wer Hilfe erwartet sollte auch ruhig selbst mal anderen helfen.

    Edit: Sorry für OT
    könnte ich auch sagen, wenn das hier ein C++ forum wäre vor allem es ist bis jetzt mehr als einmal passiert als auf einmal hinter mir stand und sagte :"Aha so sieht also C++ Programmierung aus"
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

    Kommentar


    • #17
      Wozu der Umstand, BlackScorp? Mit protected besteht das Problem überhaupt nicht. Das haben wir oben schon geklärt. Und mit private wirst Du wiederum nicht auf $xB zugreifen können.
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #18
        Zitat von nikosch Beitrag anzeigen
        Wozu der Umstand, BlackScorp? Mit protected besteht das Problem überhaupt nicht. Das haben wir oben schon geklärt.
        hast recht
        Zitat von nikosch Beitrag anzeigen
        Und mit private wirst Du wiederum nicht auf $xB zugreifen können.
        höchstens mit setter und getter methoden
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

        Kommentar


        • #19
          Danke. Ich fass dann nochmal zusammen:

          Methoden werden nicht als „Kopien“ vererbt, sondern quasi als Referenz, d. h., die vererbten Methoden werden immer über die Basisklasse aufgerufen. Will man also auf ein Attribut des aufrufenden Objekts zugreifen, dann muss dieses Attribut auch in der Basisklasse sichtbar sein (public oder protected, aber nicht private). Ist das Attribut nicht sichtbar, wird ein Attribut desselben Namens in der Basisklasse gesucht und bei einem Treffer statisch (!!) aufgerufen.

          Ich find es nach wie vor total unlogisch, aber muss man sich wohl einfach merken.

          Kommentar


          • #20
            und bei einem Treffer statisch (!!) aufgerufen.
            Nein!!

            Merk Dir einfach: Bei der Verwendung von private properties wird immer die Property benutzt, die in der selbe Klasse gesetzt wird, in der auch der Methodenrumpf definiert wird.
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #21
              Die Variable muss ja statisch aufgerufen werden, weil ich die Klasse A nie instanziiert habe:

              PHP-Code:
              class {

                      private 
              $x 'a';        # nicht statisch, 'a' ist nur eine Vorbelegung

                      
              public function test() {

                              echo 
              $this->x;

                      }

              }


              class 
              extends {

                      private 
              $x 'b';

              }


              $b = new B();        # nur Klasse B wird instanziiert, A nicht

              $b->test();        # Ausgabe 'b' 


              Die B-Instanz $b ruft die Methode test auf, die das $b-Attribut x ausgeben will. Aber $b->x ist nicht in A sichtbar (da private), also wird in A das Attribut x aufgerufen, so als wäre x statisch (als hätte ich private static $x = 'a'; geschrieben)

              Kommentar


              • #22
                Da ist nichts statisch. Sonst gäbe es $this gar nicht. Statisch würde auch bedeuten, dass sich mehrere Objekte eine Variable (un deren Inhalt) teilen. Das ist definitiv nicht so.

                Das Konzept der Vererbung ist nunmal so, dass die Eltern-Member in der abgeleiteten Klasse vorhanden sind.
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar


                • #23
                  Statisch heißt ja, dass das Attribut zu der Klasse gehört und nicht zu den Instanzen der Klasse. Also es existiert auch schon vor der Instanziierung der Klasse. Ich habe A nie instanziiert, trotzdem wird dort auf das Attribut x zugegriffen -- also wird dieses Attribut ja so behandelt, als wäre es statisch.

                  Ein nicht-statischer Zugriff wäre es, wenn ich z. B. $a = new A(); gesagt hätte und beim Methodenaufruf das Attribut $a->x genommen worden wäre.

                  Na ja, letzendlich ist es ja auch egal.

                  Kommentar


                  • #24
                    Es ist Vererbung!!
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #25
                      PS:
                      PHP-Code:
                      <?php

                      class A
                        
                      {
                        protected        
                      $a 0;
                        static protected 
                      $b 0;
                        }

                      class 
                      extends A
                        
                      {
                        function 
                      test()
                          {
                          
                      $this->a++;
                          
                      self::$b++;
                          echo 
                      $this->', ' self::$b '<br />';
                          }

                        }
                        
                      $b1=new B;
                      $b2=new B;

                      $b1->test(); // 1, 1
                      $b2->test(); // 1, 2
                      [COLOR="#F5F5FF"]--[/COLOR]
                      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                      [COLOR="#F5F5FF"]
                      --[/COLOR]

                      Kommentar


                      • #26
                        Zitat von delta Beitrag anzeigen
                        Na ja, letzendlich ist es ja auch egal.
                        Wenn du OO denken und programmieren willst, ist es elementar...
                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #27
                          An nikosch: Private Member werden nicht vererbt. Und selbst wenn: Das Attribut wäre ja sofort überschrieben worden.

                          Kommentar


                          • #28
                            Private Member werden nicht vererbt.
                            Hab ich auch nicht behauptet. Mit private würde das letzte Beispiel auch nicht funktionieren. Wäre test() in A wiederum schon.
                            [COLOR="#F5F5FF"]--[/COLOR]
                            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                            [COLOR="#F5F5FF"]
                            --[/COLOR]

                            Kommentar

                            Lädt...
                            X