[PHP5] Objekt klonen.

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

  • [PHP5] Objekt klonen.

    Habe eine Objekt, welches eine Kopie von sich selbst enthalten soll.

    Seit PHP5 werden Objekte bekannter maßen ja nicht mehr kopiert, sondern lediglich referenziert. Was ja in der Regel auch deutlich von Vorteil ist. Nur in diesem Fall eben nicht.

    Wie schaffe ich es nun innerhalb des Objektes A eine Kopie des selbigen (Objekt B) zu speichern?

  • #2
    http://www.php.net/manual/en/language.oop5.cloning.php

    Kommentar


    • #3
      google 7. link.


      http://www.acko.net/node/54


      evtl geht das ja ...


      EDIT:
      asp war schneller ....
      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        wenns danach ginge, war ich der schnellste!

        EDIT:
        versuche gerade das prob zu vereinfachen...

        Kommentar


        • #5
          PHP-Code:
          class obj
          {

            public function 
          __construct()
            {
              
          $this->value[] = 'Wert';
            }
            
            public function 
          add_value($value)
            {
              
          $this->value[] = $value;
            }
            
            public function 
          new_obj()
            {
              
          $obj = new obj(); # die stelle
              
          return $obj;
            }
            
            public function 
          reset()
            {
                
          $this->value = array();
            }

          }

          $objA = new obj();
          $objA->add_value('hinzugefügt!');

          $objB $objA->new_obj();
          $objB->add_value('auch hinzugefügt.');
          $objA->add_value($objB);
          $objB->reset(); 
          Hoffe, es ist recht selbsterklärend. Die Problemstelle ist markiert. Dort würde ich dann halt gerne eine neue Instanz und eben keine Referenz erstellen.

          Problem besteht darin, wie ich der Klasse (obj()) erzähle, dass sie sich selbst klonen soll. Sollte es keinen Weg ohne eine zweite (klonende) Klasse geben?
          Zuletzt geändert von TobiaZ; 28.12.2005, 00:51.

          Kommentar


          • #6
            Original geschrieben von TobiaZ
            Hoffe, es ist recht selbsterklärend. Die Problemstelle ist markiert. Dort würde ich dann halt gerne eine neue Instanz und eben keine Referenz erstellen.
            genau das machst du da aber?! Wo sollte denn die Referenz herkommen?
            Ansonsten probier mal
            PHP-Code:
            public function &new_obj()
              {
                
            $obj = new obj(); # die stelle
                
            return &$obj;
              } 
            Problem besteht darin, wie ich der Klasse (obj()) erzähle, dass sie sich selbst klonen soll. Sollte es keinen Weg ohne eine zweite (klonende) Klasse geben?
            mit klonen hat das nichts zutun. Du willst ja keinen Klon, sondern eine frische saubere Instanz einer Klasse!

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              @1. Das ist soweit okay, nur wird eben das ObjektB referenziert:
              Ich speicher ja B in A und setze das normale B dann zurück. Leider wird das B in A auch zurück gesetzt. Was so eben nicht sein soll.

              @2. Dann erzähl mir, wie ich an der Stelle ne saubere Instanz (ohne o.g. Referenz) erhalte

              Kommentar


              • #8
                noch any ideas?

                Kommentar


                • #9
                  Original geschrieben von TobiaZ
                  noch any ideas?
                  ah~
                  jetzt hab ich dich erstmal verstanden (und den Thread wiedergefunden...irgendwie hab ich das Gefühl mir wird nicht alles als aktuell angezeigt, aber ich hab eh nur Krieg mit der Neuer-Post-Anzeige hier im Board *tritt*)

                  Also ich habs auf php 5.1.1 ausprobier und hab 2 Lösungen für dein Problem
                  Nummer 1
                  PHP-Code:
                  $objA->add_value(clone $objB); 
                  (natürlich musst du das Objekt clonen, du willst ja die alten Eigenschaft des Objektes behalten oder nicht?)

                  Nummer 2
                  PHP-Code:
                  class obj
                  ...
                  public function 
                  add_value($value)
                  {
                      if (
                  is_object($value)) {
                          
                  $this->value[] = clone $value;
                      } else {
                          
                  $this->value[] = $value;
                      }
                  }
                  ... 
                  oder, falls du wirklich eine saubere Instanz haben willst (wovon ich nicht ausgehe)
                  Nummer 3
                  PHP-Code:
                  class obj
                  ...
                  public function 
                  add_value($value)
                  {
                      if (
                  is_object($value)) {
                          
                  $temp get_class($value);
                          
                  $this->value[] = new $temp;
                      } else {
                          
                  $this->value[] = $value;
                      }
                  }
                  ... 

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    btw. an der Stelle
                    PHP-Code:
                    public function new_obj()
                      {
                        
                    $obj = new obj(); # die stelle
                        
                    return $obj;
                      } 
                    da wird eine neue Instanz zurückgegeben, ansonsten würde ja bei einem $objB->reset() auch objA resettet werden!
                    D.h. deine "Problemstelle" war woanders (deshalb war ich wohl auch etwas verwirrt XD~)

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      Erstmal THXaLOT!!!!

                      Hab mich dann für nummer 2 entschieden. Erscheint mir im Nachhinein auch logisch. War aber einfach der Überzeugung, dass der Klonvorgang in der new_obj() hätte ablaufen sollen. Hmm.

                      bezügl. deines letzten Postings: zum einen s.o. wollte halt an der Stelle schon klonen. Das eigentliche Problem zu dem Zeipunkt war, dass das übergebene Objekt halt referenziert wurde. wenn ich B also in A abgelegt habe, dann das "äußere" B zurückgesetzt habe, wurde das abgelegte B auch zurück gelegt, weil eben die Referenz bestand.

                      Und da schließt sich auch der Kreis. Den hier hätte eigentlich schon klar sein sollen, wo gecloned werden muss.

                      Wenns jetzt weiter so klappt, bin ich echt happy. Nochmals Danke!!!

                      Kommentar

                      Lädt...
                      X