Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Werden Objekte von Klassen immer als Referenz übergeben?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Werden Objekte von Klassen immer als Referenz übergeben?

    Hallo,

    folgender Beispielcode
    PHP-Code:
    <?php
        
    class {
            public 
    $a;
        }

        class 
    tTest {
            private 
    $a;
            
            public function 
    Add () {
                
    $this->a->a++;
            }
            
            public function 
    Set (A $a) {
                
    $this->$a;
            }
        }
        
        
    $eins = new A;
        
    $eins->1;
        
        
    $zwei = new tTest;
        
    $zwei->Set($eins);
        
    $zwei->Add();
        
    $zwei->Show();
        
        
    var_dump($eins);
        
    var_dump($zwei);
    ?>
    führt dazu, dass die Ausgabe mit var_dump anzeigt, $eins->a sei ebenso wie $zwei->a->a =2. Ich hätte jetzt erwartet, dass $eins->a =1 ist und $zwei->a-> =2. Daher stelle ich mir jetzt die Frage, ob das übergebene Objekt als Referenz ankommt? Konnte zu dem Thema nix in der Doku finden.
    Und viel wichtiger noch: Wie erzeuge ich aus $zwei->a eine Kopie von $eins, sodass ich Werte von $zwei->a ändern kann, ohne dass sich $eins->a ändert?

    Gruß Heimchen


  • #2
    Mit clone. Und - doch - das steht im Manual.
    When assigning an already created instance of a class to a new variable, the new variable will access the same instance as the object that was assigned. This behaviour is the same when passing instances to a function. A copy of an already created object can be made by cloning it.
    [MOD: verschoben]
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Hatte clone schonmal durchgelesen und hatte mich etwas an der __clone-Methode gestört. Weil ich will ja nur kopieren und nix ändern. Aber wie ich grad festgestellt habe, funktioniert das ganze ohne diese Methode auch und tut genau das, was ich haben will

      Kommentar


      • #4
        Dann erstell eine neue Instanz.
        "Mein Name ist Lohse, ich kaufe hier ein."

        Kommentar


        • #5
          wie ich grad festgestellt habe, funktioniert das ganze ohne diese Methode auch
          Wiedermal die magic Methods nicht verstanden. Magische Methoden werden durch einen Vorgang aufgerufen, sie erzeugen den Vorgang nicht, können aber dessen Funktionsweise beeinflussen.

          Konstruktor.
          Standardmäßig wird ein Objekt erzeugt und zurückgegeben.
          Mit einer __construct-Methode können dem erzeugten Objekt noch Parameter zugewiesen werden oder sonstige Aktionen bei der Erzeugung gestartet werden

          Getter.
          Standardmäßig wird bei einer $object->myProperty Notation auf die Objekteigenschaft myProperty zugegriffen und deren Wert zurückgeliefert.
          Via __get kann dabei eine beliebige Aktion erfolgen oder ein dynamischer Wert zurückgeliefert etc.

          ...

          Clone.
          Standardmäßig wird bei einer clone $object Notation das betreffende Objekt mit all seinen aktuellen Eigenschaften kopiert und zurückgeliefert.
          Via __clone kann dabei eine beliebige Aktion erfolgen oder Eigenschaften des neuen Objekts verändert werden etc.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Zitat von nikosch Beitrag anzeigen
            ...

            Clone.
            Standardmäßig wird bei einer clone $object Notation das betreffende Objekt mit all seinen aktuellen Eigenschaften kopiert und zurückgeliefert. ...
            Clone erzeugt keine komplette Kopie, sondern nur eine "shallow copy" des Originalobjekts. Member-Variablen in der Kopie werden nur als Referenzen auf die Originale angelegt.

            ... Via __clone kann dabei eine beliebige Aktion erfolgen oder Eigenschaften des neuen Objekts verändert werden etc.
            Mit __clone() kann man dieses Manko (wenn es eines darstellt) "reparieren".
            Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

            Kommentar


            • #7
              Welches Manko?
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Dass der Klonvorgang eben nicht rekursiv durchgefuehrt wird meint er wohl.

                Aber wann klont man schonmal ...
                "Mein Name ist Lohse, ich kaufe hier ein."

                Kommentar


                • #9
                  Stimmt. Kommt bei mir auch sehr selten vor.
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Zitat von nikosch Beitrag anzeigen
                    Welches Manko?
                    Zitat von Chriz Beitrag anzeigen
                    Dass der Klonvorgang eben nicht rekursiv durchgefuehrt wird meint er wohl.
                    Nö, meint er nicht.
                    Alle Member-Variablen eines geklonten Objekts stellen nur (PHP-)Referenzen dar, die auf die gleichen Werte zeigen, wie die Member-Variablen des Original-Objekts. Wenn man ein Objekt klont, ist das nicht immer gewollt. Man müsste dann von Hand die Member-Variablen abklappern und ebenfalls durch Kopien ersetzen -- wenn notwendig auch rekursiv. Diese Aufgabe kann man mit __clone() automatisieren.

                    Aber wann klont man schonmal ...
                    Beispielsweise, wenn ...
                    ... das Klonen schneller|einfacher geht als das Erzeugen eines neuen Objekts.

                    ... man eine größere Zahl an Objekten erstellen möchte, die gleiche Grundeinstellungen haben, die sich aber von denen eines per new erzeugten Objekts unterscheiden.
                    Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                    Kommentar

                    Lädt...
                    X