Referenzierte Objekte -- Referenzen auf Referenzen notwendig warum?

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

  • Referenzierte Objekte -- Referenzen auf Referenzen notwendig warum?

    Für ein Klasse, mit der eine Baumartige Struktur erzeugt wird, gebe ich Referenzen auf Objekte zurück -- und zwar in der Funktion/Methode addson (mit &) . Die Gesamte Klasse (Abstrakt) ist hier

    PHP-Code:
    class rekTest{

        var 
    $son=array();
        var 
    $id 0;

        function &
    rekTest() {

            
    $this->id=uniqid(rand());
        }

        function & 
    addson() {
            return 
    $this->son[] = new rekTest();    
        }

        function 
    write() 
        {
            print 
    " Objekt ".$this->id ." hat " .count($this->son). " Kinder [";

            foreach (
    $this->son as $name =>$sonny) {

                print 
    "<br> Kind Objekt  $name => ".$sonny->id

                
    $sonny->write();
            }    
            print 
    "]";
        }

    wenn ich nun einen einfachen Test laufen lasse, bei dem ich ein Hauptobjekt erstelle dass 3 Kinder hat klappt das auch. Füge ich einem der Kinder wiederum ein Kind zu geht dieses 'verloren' weil die Referenzübergabe nicht hinhaut:

    Der Code:
    PHP-Code:
    srand(time()*1000);
    $rt = new rekTest();
    $rt->addson();
    $rt->addson();
    $rt2=$rt->addson();
    $rt2->addson();
    print 
    "<br> Objekt mit 3 Kindern und 1 Enkel <br>";

    $rt->write(); 
    bringt den Output :
    OffTopic:

    Objekt 1208700439431ada6e08aaf hat 3 Kinder [
    Kind Objekt 0 => 398521158431ada6e093a0 Objekt 398521158431ada6e093a0 hat 0 Kinder []
    Kind Objekt 1 => 988215855431ada6e09a4f Objekt 988215855431ada6e09a4f hat 0 Kinder []
    Kind Objekt 2 => 1351565107431ada6e0a335 Objekt 1351565107431ada6e0a335 hat 0 Kinder []
    ]



    Erst wenn ich Zeile 5 ändere in
    PHP-Code:
    $rt2=& $rt->addson(); 
    (also noch eine Referenz erstelle obwohl die Funktion addson per & bereits eine Referenz liefert) kommt der gewünschte Output:
    OffTopic:

    Objekt mit 3 Kindern und 1 Enkel

    Objekt 1722709587431ada4f5b4fa hat 3 Kinder [
    Kind Objekt 0 => 750183619431ada4f5bd4d Objekt 750183619431ada4f5bd4d hat 0 Kinder []

    Kind Objekt 1 => 824186739431ada4f5c618 Objekt 824186739431ada4f5c618 hat 0 Kinder []

    Kind Objekt 2 => 1694698418431ada4f5cd10 Objekt 1694698418431ada4f5cd10 hat 1 Kinder [

    Kind Objekt 0 => 125113148431ada4f5d494 Objekt 125113148431ada4f5d494 hat 0 Kinder []]
    ]



    Aber das ist nicht logisch, dafür übergebe ich die Objekte referenziert als Resultat : funciton & addson (....

    Kommentare ?? Tipps?? Fehler??

    Danke schonmal ....
    chansel0049
    ----------------------------------------------------
    if you've reached the bottomline - dig further!
    Übersetzer gesucht? http://www.babelport.com

  • #2
    Deine Funktion addson ist falsch. Wenn eine Referenz zurückgegeben werden soll, dann muss das eine Variable sein und kein Ausdruck wie es bei dir ist.

    PHP-Code:
    function &addson() {
        
    $tmp =& new rekTest();
        
    $this->son[] =& $tmp;
        return 
    $tmp;    

    hopka.net!

    Kommentar


    • #3
      Auch schon vermutet

      Das hatte ich auch schon vermutet, allerdings ist dies nicht die Lösung

      Die Ausgabe bleibt nach wie vor diesselbe, wenn die Zuweisung
      PHP-Code:
      $rt2=$rt->addson(); 
      ist:
      OffTopic:
      Objekt 1574737937431bde61b197e hat 3 Kinder [
      Kind Objekt 0 => 601500058431bde61b24f8 Objekt 601500058431bde61b24f8 hat 0 Kinder []
      Kind Objekt 1 => 234629018431bde61b2cf8 Objekt 234629018431bde61b2cf8 hat 0 Kinder []
      Kind Objekt 2 => 431035532431bde61b353e Objekt 431035532431bde61b353e hat 0 Kinder []]


      und erst mit der Zuweisung
      PHP-Code:
      $rt2=&$rt->addson(); 
      wird der gewünschte Output / Referenzierung erzeugt:

      OffTopic:
      Objekt 1209104463431bdf1110199 hat 3 Kinder [
      Kind Objekt 0 => 1298605594431bdf1110911 Objekt 1298605594431bdf1110911 hat 0 Kinder []
      Kind Objekt 1 => 308683306431bdf1111082 Objekt 308683306431bdf1111082 hat 0 Kinder []
      Kind Objekt 2 => 503670874431bdf1111c5d Objekt 503670874431bdf1111c5d hat 1 Kinder [
      Kind Objekt 0 => 1067447474431bdf1112403 Objekt 1067447474431bdf1112403 hat 0 Kinder []]]
      chansel0049
      ----------------------------------------------------
      if you've reached the bottomline - dig further!
      Übersetzer gesucht? http://www.babelport.com

      Kommentar

      Lädt...
      X