[OOP] Referenz auf Instanz einer übergeordneten Klasse

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

  • [OOP] Referenz auf Instanz einer übergeordneten Klasse

    Moin!

    Ich hab eine Klasse, in welcher Instanzen der selben Klasse erzeugt werden, also Rekursiv. Diese Sub-Instanzen können wieder mehrere Sub-Instanzen haben, und so weiter, sodass ich eine Klassen-Baumstruktur erhalte.
    Nun ist es nötig, dass ich aus einer Sub-Instanz eine Variable in der übergeordneten Instanz verändern kann. Dazu hab ich in der Klasse eine Variable Eingefügt, in die beim Erstellen der Instanz &$this (Also die Referenz) der erstellenden Instanz gespeichert wird. Ändere ich nun die Variable über die Referenz, so ändern sich die Werte in der übergeordneten Instanz nicht.

    Wie kann ich also eine Variable in einem übergeordneten Objekt ändern, ohne auf das übergeordnete Objekt von aussen zuzugreifen (Ich habe also nicht die Möglichkeit, die Variable mithilfe einer Methode aus der Sub-Klasse zu "ziehen")?

    Ist warscheinlich etwas schwer zu verstehen, aber es gibt ja Leute hier, die die Kompliziertesten Texte entschlüsseln können. Danke schonmal an jene, und alle, die versuchen das zu Verstehen, und zu Helfen. Hier noch mal ein Code, der das Problem beschreibt. Er ist nicht der Originalcode, desshalb lässt sich kein Sinn erkennen, er ist jedoch wesentlich kürzer, übersichtlicher und leichter zu Verstehen.

    PHP-Code:
    class class1 {
      var 
    $subclass  NULL;
      var 
    $variable  'alter Wert';
      var 
    $parentcls true;
      var 
    $parentref NULL;

      function 
    class1 ($parentcls true$parentref NULL) {
        
    $this -> parentcls $parentcls;
        if (!
    $this -> parentcls)
          
    $this -> parentref $parentref;
      }

      function 
    create_subclass () {
        
    # Erstellen der Sub-Klasse mit Referenz-Parameter zur eigenen Instanz:
        
    $this -> subclass = new class1 (false, &$this);
      }
      
      function 
    set_var ($var) {
        
    $this->variable $var;
        if (!
    $this -> parentcls)
          
    # Variablenwert auch in der Elternklasse zuweisen:
          
    $this -> parentref -> variable $var;
      }
      
      function 
    echo_var () {
        echo 
    $this -> variable '<br>';
      }
    }

    $cls = new class1;
    $cls -> create_subclass ();
    $cls -> subclass -> set_var ('neuer Wert');
    $cls -> subclass -> echo_var ();
    $cls -> echo_var ();

    # Ergebniss:
    #
    # neuer Wert
    # alter Wert
    #
    # Soll-Ergebniss:
    #
    # neuer Wert
    # neuer Wert 

  • #2
    so wie ich das verstanden habe, sind die tatsächlichen ergebnisse durchaus nachvollziehbar, denn durch die übergabe des $this als referenz führt dazu, dass sowohl $cls als auch $cls->subclass auf das gleiche objekt verweisen.

    wenn du $this kopieren lässt, wird es zwei objekte geben (wobei das eine eine eigenschaft des anderen sein würde), die unterschiedliche eigenschaften haben können.

    Kommentar


    • #3
      nein, denn ich weise $cls->subclass ja nicht &$this zu, sondern einer Variable ($parentref) in $cls->subclass... Somit müssten die Variable in $cls->subclass und $cls auf das gleiche Objekt verweisen. Das tun sie aber anscheinend nich!

      Und auch, wenn das Ergebniss nachvollziehbar währe, löst das mein Problem leider nicht, weil mir auch keine andere Möglichkeit einfällt.

      Kommentar


      • #4
        hast recht.

        was ändert sich, wenn du $this nicht als referenz übergibst, sondern als kopie?

        Kommentar


        • #5
          Die Ausgabe bleibt gleich. Aber dann ist es auch logisch.

          Kommentar


          • #6
            dann versuch mal im konstruktor die zeile
            PHP-Code:
            $this -> parentref $parentref
            zu
            PHP-Code:
            $this -> parentref =& $parentref
            zu ändern, damit die referenz bei der zuweisung der eigenschaft entsteht.

            Kommentar


            • #7
              Jo, wenn man beides macht, dann geht es...

              also:
              PHP-Code:
              ...
              $this -> parentref =& $parentref;
              ...
              $this -> subclass = new class1 (false, &$this);
              ... 
              Vielen Dank!

              Kommentar

              Lädt...
              X