destrutor problem

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

  • #16
    Zitat von h3ll Beitrag anzeigen
    Abgesehen von "cyclic references" sollte das aber möglich sein. Wenn nicht, ist irgendwas am Code unsauber.
    Das hat nichts mit unsauberen Code zu tun.
    "Unsauber" ist vielleicht nicht das passende Wort.
    (PHP-)Referenzen bleiben "zählbar", wenn man sie vernünftig einsetzt. Für Objekte und "Resourcen" benötigt man keine (expliziten) Referenzen. Bei Arrays kommts auf den Einzelfall an.
    Zuletzt geändert von fireweasel; 06.09.2011, 23:44.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


    • #17
      Ninja-Edit @fireweasel: Ich habe mit dieser Antwort gerade übelste Race Conditions bezüglich deiner Edits. Sorry dafür.

      Hast du den Satz mit Stack Overflow wieder rauseditiert? Na ja, egal.

      (Verlinkter Artikel: Parameter passing in Java - by reference or by value?. Durchaus interessant zu lesen.)

      Das predige (auch) ich seit langem.[1]

      Zitat von fireweasel
      In allen anderen Fällen auch. Sämtliche anderen Variablen, die dieses Objekt referenzieren, zeigen dann auch auf null.
      Ja, die es (besser gesagt die Variable) (im PHP-Sinne) referenzieren… Gut, so gesehen ist deine Aussage völlig richtig. Ich bin aber nicht sicher, dass wahsaga wirklich Referenzen meinte.

      Referenzen spielen bei Objekten in aller Regel absolut keine Rolle.

      Es ist schon bemerkenswert, wie sehr man sich auch als gestandener PHP-Programmierer dabei immer wieder in Definitionen oder ungenauer Ausdrucksweise verheddert.[2]



      [1] Schamlos!
      [2] Die Aussage beziehe ich natürlich zuerst auf mich selbst.

      Kommentar


      • #18
        Zitat von fireweasel Beitrag anzeigen
        "Unsauber" ist vielleicht nicht das passende Wort.
        (PHP-)Referenzen bleiben "zählbar", wenn man sie vernünftig einsetzt. Für Objekte und "Resourcen" benötigt man keine (expliziten) Referenzen. Bei Arrays kommts auf den Einzelfall an.
        Objekte werden in PHP immer als Referenz übergeben. OK, es ist keine richtige Referenz, aber trotzdem werden Objekte nicht immer gelöscht, nur weil man eine Variable auf NULL setzt oder unset() verwendet. Das sollte einem bewusst sein.

        Auch macht es selten Sinn Variablen auf NULL zu setzen, weil sie am Ende jeder Funktion sowieso automatisch gelöscht werden. Wie gesagt, die Variablen, und nicht unbedingt die Objekte. Es ist nur unnötige Schreibarbeit. Und globale Variablen sollte man sowieso nicht verwenden.

        Das selbe gilt für Objektvariablen. Wenn ein Objekt gelöscht wird, werden auch automatisch alle Objektvariablen gelöscht. Deswegen ist es auch ziemlich sinnlos sie im Destruktor nochmal explizit zu löschen bzw. auf NULL zu setzen.
        Zuletzt geändert von h3ll; 07.09.2011, 06:41.

        Kommentar


        • #19
          Zitat von h3ll
          Objekte werden in PHP immer als Referenz übergeben. OK, es ist keine richtige Referenz, …
          Ich seh's so:

          („Objektvariable“ meint hier: eine Variable, deren Wert ein Object Identifier ist. Public/private/protected Variablen innerhalb einer Klasse sind für mich Instanzvariablen.)

          Die Parameterübergabe sowohl von primitiven Datentypen (float, string, …) als auch von Objekten geschieht standardmäßig als Call-by-value. Auch Objekte werden nur dann by-reference übergeben, wenn dies durch das &-Zeichen in der Funktionssignatur explizit vermerkt ist. Der Inhalt (im Sinne von value) einer Objektvariable sind nicht die Instanzdaten selbst, sondern eine Art Ressourcen-Kennung (Object-Identifier), über die PHP auf die Instanzdaten zugreift.

          PHP-Code:
          // Call-by-value
          function f($a) {
              
          $a null;
          }

          // Call-by-reference
          function g(&$a) {
              
          $a null;
          }

          $s 'foo'f($s); var_dump($s); // string(3) "foo"
          $s 'foo'g($s); var_dump($s); // NULL

          $o = new stdClass(); f($o); var_dump($o); // object(stdClass)#1 (0) { }
          $o = new stdClass(); g($o); var_dump($o); // NULL 
          - 4.1: Don't panic! The Hitchhiker's Guide to PHP oddities - php.de

          Noch kurz zur Verdeutlichung:

          Zitat von h3ll
          …aber trotzdem werden Objekte nicht immer gelöscht, nur weil man eine Variable auf NULL setzt…
          Es sei denn, alle Variablen, die auf ein Objekt zeigen, sind Referenzen. (Nein, das ist nicht sonderlich realistisch.)

          PHP-Code:
          $a = new stdClass();
          $b $a;

          $b null;

          var_dump($a$b); // object(stdClass), NULL


          $c = new stdClass();
          $d = &$c;

          $d null;

          var_dump($c$d); // NULL, NULL 
          …oder unset() verwendet. Das sollte einem bewusst sein.
          unset entfernt auch bei Referenzen lediglich das Symboltabellenalias, hat aber keinerlei Auswirkung auf den Inhalt.

          PHP-Code:
          $e = new stdClass();
          $f $e;

          unset(
          $f);

          var_dump($e$f); // object(stdClass), NULL


          $g = new stdClass();
          $h = &$g;

          unset(
          $h);

          var_dump($g$h); // object(stdClass), NULL 

          Kommentar


          • #20
            Ich kenn den Unterschied zwischen Referenz und Object-Identifier und zwischen unset und Zuweisung. Aber trotzdem danke für die ausführliche Schilderung. Dafür war ich selber zu bequem

            Wie du schön gesagt hast, wenn man nur Referenzen verwendet, kann man Objekte (fast) zuverlässig löschen. Nur haben Referenzen so viele mögliche Seiteneffekte, dass man besser die Finger davon lässt.

            Kommentar


            • #21
              Offtopic:
              Ja, ist mir klar, dass du den kennst. Ich dachte, weil wir hier die Begrifflichkeiten teilweise durcheinander gewürfelt haben, schreibe ich's mal einmal sauber auf.

              Kommentar

              Lädt...
              X