vererben oder referenzen?

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

  • #16
    Original geschrieben von invitatoinvitat
    doch wenn ich am ende der index datei die db statistiken abfrage, steht da nach wie vor 0 queries ausgeführt
    ich kriege auch gar keine datenbankverbindung in der klasse zustande, wie ich gerade an einem insert-befehl getestet habe
    mache mal beim init von Usermanagement bei $db das & weg.

    auch solltest du eine class immer mit &new statt nur new initialisieren.
    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


    • #17
      Sorry, wenn ich diesen Thread nochmal aufrufe, aber irgendwie bin ich mit den Erläuterungen nicht ganz zufrieden gewesen , also habe ich ein wenig getestet.

      Schauen wir uns folgendes Beispiel an:
      PHP-Code:
        $a 1;
       
      $b $a;
       echo 
      "a: ".$a."b: ".$b."<br>";
       
      $a++; 
       
      $b++;
       echo 
      "a: ".$a."b: ".$b."<br>";
       
       
      $a 1;
       
      $b =& $a;
       echo 
      "a: ".$a."b: ".$b."<br>";
       
      $b++;
       echo 
      "a: ".$a."b: ".$b."<br>";
       
      $a++;
       echo 
      "a: ".$a."b: ".$b."<br>"
      Im ersten Block wird $a auf 1 und $b gleich $a gesetzt. Inkrementiren wir $a und $b, passiert das, was wohl jeder erwartet.

      Im zweiten Block wird $a auf 1 und $b bekommt eine Referenz auf $a. Nach dem Php-Handbuch bedeutet die Referenz, dass $a und $b ab sofort auf den gleichen Inhalt zeigen. Inkrementiert man $a wird also auch $b inkrementiert und umgekehrt.

      Na gut, was passiert jetzt bei Objekten?
      Nehmen wir an, wir verwenden zwei Klassen, eine davon ist unsere DB-Klassen db, die andere soll irgendwelche Operationen ausführen.

      PHP-Code:
          class test
       
      {    
           function 
      test2($Obj){
               
      $Obj->setze_var("2element");
           }
       }
       
       class 
      db
       
      {
           var 
      $test;
           
           function 
      test(){
               
      $this->test['1element'] = "gesetzt";
           }
           
           function 
      setze_var($var){
               
      $this->test[$var] = "gesetzt";
           }
           
           function 
      zeige(){
               
      print_r($this->test);
           }
       }
       
       
       
      $Otest = new test;
       
      $ODb = new db;
       
       
      $Otest->test2($ODb);
       
      $ODb->zeige();
       
      $ODb->setze_var("3element");
       
      $ODb->zeige(); 
      Wie jeder wissen sollte, wird per new ein Objekt einer Klasse angelegt. Worin würde jetzt der Unterschied zwischen $ODb = new db; und $ODb =& new db; liegen? Meiner Meinung nach gibts da keinen, denn new db erzeugt ein Objekt der Klasse db - im Fall von = bekommt $ODb ein Objekt übergeben, im Fall von =& bekommt $ODb eine Referenz auf das erzeugte Objekt übergeben, in diesem Fall zeigt die Referenz aber genauso auf das eben instanziierte Objekt.

      Da ich z.B. in meinem DB-Objekt die Anzahl aller verwendeten Queries ausgeben will, muss ich dafür sorgen, dass alle anderen Objekte immer das gleiche DB-Objekt verweden.
      Rufe ich nun wie im Bsp. oben $Otest->test2($ODb); auf, übergebe ich an die Methode test2 das Objekt $ODb, das Problem ist aber nun, dass wenn ich den Rumpf der Methode function test2($Obj) so definiere, er mir meine Variable in eine neue Instanz des übergebenen Objektes schreibt. Durch function test2(&$Obj) kann ich dies ändern, in dem dann anscheinend der PHP-Interpreter versteht, dass ich die gleiche Instanz des übergebenen Objektes verwenden will (wäre sozusagen ein call by reference).

      Damit sollte man also, wenn man immer das gleiche Objekt verwenden will, die folgende Methoder verweden:
      PHP-Code:
        class test
       
      {    
           function 
      test2(&$Obj){
               
      $Obj->setze_var("2element");
           }
       }
       
       class 
      db
       
      {
           var 
      $test;
           
           function 
      test(){
               
      $this->test['1element'] = "gesetzt";
           }
           
           function 
      setze_var($var){
               
      $this->test[$var] = "gesetzt";
           }
           
           function 
      zeige(){
               
      print_r($this->test);
           }
       }
       
       
       
      $Otest = new test;
       
      $ODb = new db;
       
       
      $Otest->test2($ODb);
       
      $ODb->zeige();
       
      $ODb->setze_var("3element");
       
      $ODb->zeige(); 
      Überigens ist das in PHP5 logischer gelöst. Da muss ich auch im Funktionsrumpf das Objekt nicht referenzieren.

      Probierts mal aus .

      Grüße,
      tommie

      Kommentar

      Lädt...
      X