Wie zerstöre ich ein Objekt richtig?

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

  • Wie zerstöre ich ein Objekt richtig?

    Ja, das ist die Frage!

    Folgende Sachen habe ich versucht:
    PHP-Code:
    class Test
    {
     ...
     public function 
    __destruct()
     {
      
    fopen("test.txt""w");
      echo 
    "Destruct wird ausgefuehrt";
     }

    So, ich habe im Destructor also 2 Funktionen benutzt die mir zeigen ob der Destructor aufgerufen wurde!

    Variante 1:
    PHP-Code:
    $eins = new Test();

    // Ausgabe:
    // KEINE "test.txt" erstellt!
    // Destruct wird ausgefuehrt 
    Der destructor wird also ausgeführt, es befindet sich aber keine test.txt im Verzeichnis.

    Variante 2:
    PHP-Code:
    $eins = new Test();

    $eins->__destruct;

    // Ausgabe:
    // "test.txt" wurde erstellt!
    // Destruct wird ausgeführt
    // Destruct wird ausgeführt 
    Ich bkomme die test.txt wie gewünscht erstellt, die Ausgabe mit "echo" erfolgt 2x!

    Variante 3:
    PHP-Code:
    $eins = new Test();

    $eins NULL;
    unset(
    $eins);

    // Ausgabe:
    // "test.txt" wurde erstellt
    // Destruct wird ausgeführt 
    Ich bekomme die test.txt erstellt, und die Ausgabe findet einmal statt! Eigentlich alles wie gewollt!

    Aber ich will die Klasse mit einem $eins->close(); oder $eins->__destruct(); beenden.
    Aber ich bekomme das oben gezeigte verhalten das der destructor teilweise doppelt ausgeführt wird, wieso?!?!

  • #2
    Das der direkte Aufruf von __destruct() zu Problemen führt, ist klar. Sobald du diese Methode aufrufst wird die Instanz deiner Klasse nicht zerstört. __destruct() ist nur eine Methode, die automatisch am Ende des Skripts aufgerufen wird, hat aber mit der Zerstörung der Instanz nichts zu tun. Siehe hierzu folgendes Skript:

    PHP-Code:
    <?php
    class Foo
    {
        public function 
    test() {
            echo 
    'test-Methode wurde aufgerufen -> Instanz funktioniert<br />';
        }
        
        public function 
    __destruct() {
            
    //hier der destruct-kram, in deinem fall fopen()
            
    echo '__destruct() wurde aufgerufen<br />';
        }
    }

    $foo = new Foo;
    $foo->test(); //ausgabe: test-Methode wurde aufgerufen -> Instanz funktioniert<br />
    $foo->__destruct(); //ausgabe: __destruct() wurde aufgerufen<br />
    $foo->test(); //ausgabe: test-Methode wurde aufgerufen -> Instanz funktioniert<br />
    unset($foo); //ausgabe: __destruct() wurde aufgerufen<br />
    $foo->test(); //fehlermeldung
    ?>
    Also, zusammengefasst: __construct() zerstört die Instanz nicht.

    Kommentar


    • #3
      OffTopic:
      Also, zusammengefasst: __construct() zerstört die Instanz nicht.
      Ne, das sogar 100%ig nicht ^^

      Kommentar


      • #4
        Original geschrieben von matzeee
        Das der direkte Aufruf von __destruct() zu Problemen führt, ist klar. Sobald du diese Methode aufrufst wird die Instanz deiner Klasse nicht zerstört. __destruct() ist nur eine Methode, die automatisch am Ende des Skripts aufgerufen wird, hat aber mit der Zerstörung der Instanz nichts zu tun. Siehe hierzu folgendes Skript:

        PHP-Code:
        <?php
        class Foo
        {
            public function 
        test() {
                echo 
        'test-Methode wurde aufgerufen -> Instanz funktioniert<br />';
            }
            
            public function 
        __destruct() {
                
        //hier der destruct-kram, in deinem fall fopen()
                
        echo '__destruct() wurde aufgerufen<br />';
            }
        }

        $foo = new Foo;
        $foo->test(); //ausgabe: test-Methode wurde aufgerufen -> Instanz funktioniert<br />
        $foo->__destruct(); //ausgabe: __destruct() wurde aufgerufen<br />
        $foo->test(); //ausgabe: test-Methode wurde aufgerufen -> Instanz funktioniert<br />
        unset($foo); //ausgabe: __destruct() wurde aufgerufen<br />
        $foo->test(); //fehlermeldung
        ?>
        Also, zusammengefasst: __construct() zerstört die Instanz nicht.
        Das __construct die Instanz nicht zerstört ist schon klar^^

        Du "zerstörst" die Instanz mit einem unset($INSTANZ);
        Aber überall liest man dass das nur für PHP4 richtig ist!
        In PHP5 soll man $INSTANZ = NULL und anschließend unset($INSTANZ) aufrufen.

        Aber nochmal eine Frage: Wenn die methode __destruct am ende des SCripts automatisch ausgefürht wird, wieso erstell fopen dann keine .txt datei, wenn ich die Klasse aber manuell "zerstöre" wird die Datei erstellt?!

        Kommentar


        • #5
          Original geschrieben von matzeee
          Das der direkte Aufruf von __destruct() zu Problemen führt, ist klar. Sobald du diese Methode aufrufst wird die Instanz deiner Klasse nicht zerstört. __destruct() ist nur eine Methode, die automatisch am Ende des Skripts aufgerufen wird, hat aber mit der Zerstörung der Instanz nichts zu tun. Siehe hierzu folgendes Skript:

          PHP-Code:
          <?php
          class Foo
          {
              public function 
          test() {
                  echo 
          'test-Methode wurde aufgerufen -> Instanz funktioniert<br />';
              }
              
              public function 
          __destruct() {
                  
          //hier der destruct-kram, in deinem fall fopen()
                  
          echo '__destruct() wurde aufgerufen<br />';
              }
          }

          $foo = new Foo;
          $foo->test(); //ausgabe: test-Methode wurde aufgerufen -> Instanz funktioniert<br />
          $foo->__destruct(); //ausgabe: __destruct() wurde aufgerufen<br />
          $foo->test(); //ausgabe: test-Methode wurde aufgerufen -> Instanz funktioniert<br />
          unset($foo); //ausgabe: __destruct() wurde aufgerufen<br />
          $foo->test(); //fehlermeldung
          ?>
          Also, zusammengefasst: __construct() zerstört die Instanz nicht.
          Das __construct die Instanz nicht zerstört ist schon klar^^

          Du "zerstörst" die Instanz mit einem unset($INSTANZ);
          Aber überall liest man dass das nur für PHP4 richtig ist!
          In PHP5 soll man $INSTANZ = NULL und anschließend unset($INSTANZ) aufrufen.

          Aber nochmal eine Frage: Wenn die methode __destruct am ende des SCripts automatisch ausgefürht wird, wieso erstell fopen dann keine .txt datei, wenn ich die Klasse aber manuell "zerstöre" wird die Datei erstellt?!

          Kommentar


          • #6
            Okay, dann habe ich deinen Ausgangspost falsch gedeutet, sorry . Warum Variante 1 nicht funktioniert ist mir selbst nicht ganz klar. Komischer Weise funktioniert es mit absoluten Pfadangaben.

            PHP-Code:
            <?php
            class Foo
            {
                public function 
            __destruct() {
                    if (!
            fopen('datei1.txt''w')) {
                        echo 
            'Datei mit relativer Pfadangabe konnte nicht erstellt werden<br />';
                    }

                    if (!
            fopen('/Applications/xampp/htdocs/datei2.txt''w')) {
                        echo 
            'Datei mit absoluter Pfadangabe konnte nicht erstellt werden<br />';
                    }
                }
            }

            $foo = new Foo;

            //ausgabe: Datei mit relativer Pfadangabe konnte nicht erstellt werden<br />
            ?>
            Warum genau das so ist, kann ich dir leider nicht beantworten. Getestet auf einem Macintosh mit PHP5 und Apache.

            Kommentar


            • #7
              Das ist so, weil der PHP-Interpreter u.U. während des Shutdowns das Arbeitsverzeichnis wechselt. Wenn ich mich nicht irre gibt es einige User Comments dazu auf der Manualseite von register_shutdown_function().

              Viel Spass beim Suchen der test.txt.

              Kommentar


              • #8
                Viel Spass beim Suchen der test.txt.
                Die wird sich dann im Apache/bin Ordner befinden, wenn denn der Apache dort Schreibrecht hat.

                Das Problem tritt nicht im CGI Modus auf, also nur wenn PHP als Apache Modul läuft.
                Wir werden alle sterben

                Kommentar


                • #9
                  Aaaaaja vielen Dank, jetzt habe ich das verstande =)...
                  Das muss man ja erstmal wissen das PHP das Verzeichnis wechselt bevor die Klassen zerstört werden!

                  Die Datei befand sich übrigens im Hauptverzeichnis (da wo die apache_start.bat drin ist).

                  Und sorry für den Doppelpost oben, das Forum war total langsam an dem Tag und beim ersten mal absenden hatte ich eine weiße Seite angezeigt bekommen...

                  Kommentar


                  • #10
                    Tja, dann ist bei dir die apache_start.bat wohl die Mutter aller Webserverprozesse...
                    Wir werden alle sterben

                    Kommentar

                    Lädt...
                    X