Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisfrage zu überschreiben von gerbten Variablen

Einklappen

Neue Werbung 2019

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

  • Verständnisfrage zu überschreiben von gerbten Variablen

    Hi,

    stehe vor einem Verständigungsproblem.

    Zitat siehe unten sagt das die Variable $gewaschen aus der Klasse Mensch überschrieben wurde.

    Das soll ja heißen die Variable darf im Speicher nur einmal vorkommen !?

    Wenn ich mit dem PHP Debugger teste, erhalte ich:



    Ich sehe das für die Klasse Mensch, sowohl als auch für die Klasse Frau eine Variable $gewaschen existiert.


    Dann stimmt doch die Zitat Aussage nicht, oder bin ich doof .




    Stöber gerade Peter Kropff - Objektorientierte Programmierung mit PHP5 - Techniken - Überschreiben durch.

    Dort steht folgendes Zitat:

    "$gewaschen wurde in der Klasse Mensch als stinknormale Variable definiert.
    Da das aber bei Frauen nicht ausreicht, haben wir den Typ in der Klasse Frau als Array festgelegt.
    Damit "überschreiben" wir die Variable $gewaschen aus der Klasse Mensch."

    Die Klasse Mensch

    PHP-Code:
    class Mensch
    {
      private 
    $gewaschen;
      private function 
    koerperpflege ($wert)
      {
        
    $this -> gewaschen $wert;
      }
      public function 
    returnPflege ($wert)
      {
        
    $this -> koerperpflege ($wert);
        return 
    $this -> gewaschen;
      }

    Die Klasse Frau

    PHP-Code:
    class Frau extends Mensch
    {
      private 
    $gewaschen = array();
      private function 
    koerperpflege ($wert)
      {
        foreach (
    $wert as $value)
        {
          
    $this -> gewaschen[] = $value;
        }
        return 
    $this -> gewaschen;
      }



  • #2
    Du hast wahrscheinlich das Prinzip von vererbungen nicht verstanden.

    Mensch hat gewaschen=null
    Frau erbt von Mensch gewaschen=null
    Frau definiert geschaschen neu
    somit ist frau::gewaschen=array

    Bei dem Zitat geht es nur darum das die frau den geerbten wert überschreibt

    Damit "überschreiben" wir die Variable $gewaschen aus der Klasse Mensch.
    nicht
    Damit "überschreiben" wir die Variable $gewaschen in der Klasse Mensch.

    oder habe ich deine frage falsch verstanden?

    Kommentar


    • #3
      Vielleicht zeigt dir hier der Debugger eben nicht den tatsächlichen Variablen stand an sondern zeigt dir auf was in der gewaschen Variable vom Menschen gewesen wäre ... ? Aber bin mir da nicht sicher, eigentlich sollte die Variable überschrieben sein.

      Kommentar


      • #4
        Zitat von Flor1an
        Aber bin mir da nicht sicher, eigentlich sollte die Variable überschrieben sein.
        Warum? Je nachdem, was mit überschrieben gemeint ist.

        Also die Ausführung von Squall trifft es imho schon.
        Die Klassen Frau und Mann erben ja von der Klasse Mensch, sind aber eigenständige Instanzen!
        Und damit besitzen Sie die abgeleiteten Eigenschaften und Methoden der Klasse Mensch und können mit denen unabhänging voneinander
        in Ihrer eigenen Instanz damit arbeiten.

        Ganz wichtig finde ich das:
        Zitat von Squall
        Damit "überschreiben" wir die Variable $gewaschen aus der Klasse Mensch.
        nicht
        Damit "überschreiben" wir die Variable $gewaschen in der Klasse Mensch.
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Wie Squall schon gesagt hat, wird $gewaschen in der Klasse Frau erneut deklariert. Soll die Variable von der Klasse Mensch übernommen werden, so darf sie in er Unterklasse nicht erneut deklariert werden.

          Das ist ein richtig fieses Beispiel. Sowas bitte nie nicht gar nicht machen.

          Kommentar


          • #6
            @Arne Drews: Wie kann ich dann in der Klasse Frau auf die Eigenschaft $gewaschen in der Klasse Mensch zugreifen? Das geht meiner Meinung nach nicht!

            Kommentar


            • #7
              Das ist mir neu: wie kann ich den auf $gewaschen zugreifen??

              Wolf29
              while (!asleep()) sheep++;

              Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

              Kommentar


              • #8
                Nicht daß ich ganz verkehrt liege, aber in folgendem Beispiel müßte nach Eurer Meinung die Variable $gewaschen aus Mensch überschireben werden?
                PHP-Code:
                class Mensch {

                  private 
                $gewaschen;


                  public function 
                koerperpflege($wert) {
                    
                $this -> gewaschen $wert;
                  }

                  public function 
                returnPflege() {
                    return 
                $this -> gewaschen;
                  }


                }


                class 
                Mann extends Mensch {
                }


                $Hans = new Mann;
                $Wurst = new Mann;

                $Hans->koerperpflege('Seife');
                $Wurst->koerperpflege('Wasser');

                echo 
                'Hans: ' $Hans->returnPflege() . '<br />';
                echo 
                'Wurst: ' $Wurst->returnPflege(); 
                ergibt aber als Ausgabe:
                Code:
                Hans: Seife
                Wurst: Wasser
                Was für mich so viel bedeutet, daß jede Instanz in Ihrem Gültigkeitsbereich die Eigenschaft $gewaschen selbst verwaltet.
                Ohne daß ich diese neu deklariert habe...

                Klar kann ich sie überschreiben, aber imho nur in der eigenen Instanz!


                EDIT
                Daß man über Frau auf die Eigenschaft in Mensch zugreifen kann habe ich nie behauptet!
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar


                • #9
                  Das ist korrekt, ich habe es so aus dem Kontext interpretiert. Wäre aber interessant gewesen, wenn das ginge!

                  Wolf29
                  while (!asleep()) sheep++;

                  Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

                  Kommentar


                  • #10
                    Ich glaub du redest von was anderem. Das jede Instanz ihre eigenen Variablen verwaltet ist ja klar. Es geht darum er IN der Klasse Mann/Frau AUCH eine Variable $gewaschen definiert.

                    Heißt diese Variable überschreibt die Variable $gewaschen aus der Vaterklasse Mensch.

                    Und sein Problem ist das der PHP Debugger anzeigt das aber die Variable aus der Vaterklasse immer noch existiert. Dies tut sie aber meiner Meinung nach nicht und ich gehe davon aus der Debugger zeigt ihm diese Variable nur deswegen um eben aus debugging Zwecken zu sehen was da vorher drin war bevor sie überschrieben wurde.

                    Kommentar


                    • #11
                      Zitat von Flor1an
                      Heißt diese Variable überschreibt die Variable $gewaschen aus der Vaterklasse Mensch.
                      Genau da sehe ich die Verständnisschwierigkeit!
                      Denn müßte es nicht eigentlich heißen:
                      "Diese Variable überschreibt die aus der Vaterklasse Mensch geerbte Variable $gewaschen."?!

                      Denn die Frage zum Verständnis des TE geht imho genau dahin!
                      Er ist sich m.M. nach nicht sicher, ob sich der Wert von $gewaschen innerhalb von Mensch ändert bzw. der Datentyp in Mensch geändert wird.
                      Und das passiert definitiv nicht!
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Der wert in Mensch bleibt unverändert und existiert weiterhin.

                        Frau erbt die eigenschaften von Mensch
                        Danach entscheidet frau selbst welche werte sie geändert haben möcht, kann aber jederzeit auf den von der Vateklasse "Mensch" definierten wert anhand parent::eigenschaft zurückgreifen. Daher existieren weiterhin beide werte mit unterschiedliche inhalt.

                        ein beispiel währe:

                        PHP-Code:
                        class Mensch {
                            public 
                        $typ 'mensch';
                        }

                        class 
                        Frau extends Mensch {
                            public 
                        $typ 'Frau';
                            
                            public function 
                        frau_Will_Nichtmehr_Anahand_Ihres_Geschlechts_Beurteilt_Werden() {
                                
                        $this->typ parent::typ;
                            }
                        }

                        $frau = new Frau();
                        // $frau->typ = Frau
                        $frau->frau_Will_Nichtmehr_Anahand_Ihres_Geschlechts_Beurteilt_Werden();
                        // $frau->typ = mensch
                        // der wert aus Mensch bleibt unverändert und existiert weiterhin wodurch solche aktionen möglich sind 

                        Kommentar


                        • #13
                          Schawoll... So is fein erklärt...
                          Competence-Center -> Enjoy the Informatrix
                          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                          Kommentar


                          • #14
                            Das geht aber nicht!

                            Du greifst hier auf ne Konstante zu, es müsste also eher parent::$typ; heißen. Dann kommt aber folgender Fehler:
                            Fatal error: Access to undeclared static property: Mensch::$typ in ...

                            Ich denke es ist nicht möglich auf den Wert zuzugreifen.

                            Kommentar


                            • #15
                              Jo, damit hast Du vollkommen recht, aber ob zugegriffen werden kann oder nicht,
                              wichtig für den TE wird sein, daß jede Instanz mit Ihren eigenen Werten arbeitet, auch wenn die Eigenschaft geerbt ist.
                              Competence-Center -> Enjoy the Informatrix
                              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                              Kommentar

                              Lädt...
                              X