Johannes32: Klasse zerstören?

Hi!

Ich hab eine Schleife die (vereinfacht) so aussieht:

$array = array ("input1", "input2);
foreach($array as $input)
 $class1 = new Class1 ( $input );
 $class1->dosomething();
 // hier muss es zerstört werden!
}

Wie kann ich die Klasse zerstören, damit ich danach eine weitere erstellen kann?

danke
Johannes

  1. Wie kann ich die Klasse zerstören, damit ich danach eine weitere erstellen kann?

    ich hoffe die seite über konstruktoren und destruktoren bei php.net lässt keine frage offen

    in php 4 gibt es übrigens keine epliziten destruktoren, allerdings lässt sich unset dafür verwenden

  2. echo $begrüßung;

    Wie kann ich die Klasse zerstören, damit ich danach eine weitere erstellen kann?

    Klassen können nicht "zerstört" werden, aber Objekte werden wie jeder andere Variablencontainer[1] aufgeräumt, wenn kein Variablenname mehr darauf verweist. Mit unset() kann das gezielt erreicht werden.Im Normalfall kannst einer Variablen einfach ein neues Objekt zuweisen, um das alte zu verwerfen. Sind im Destruktor aber Aufräumarbeiten, wie das Freigeben einer Ressource, die vor dem Erstellen eines weiteren Objekts erfolgen müssen, so solltest du explizit unset() verwenden. Vielleicht lässt sich auch ein besserer Ansatz mit einem der Patterns Factory oder Singleton finden.

      
    class Foo {  
      private $foo = null;  
      
      function __construct($foo) {  
        $this->foo = $foo;  
        echo microtime(true) . ": $this->foo erstellt\n";  
      }  
      
      function __destruct() {  
        echo  microtime(true) . ": $this->foo aufgeräumt\n";  
      }  
    }  
      
    $a = new Foo('a1');  
    //unset($a);  
    $a = new Foo('a2');  
      
    sleep(3);  
    echo  microtime(true) . ": Ende\n";  
    
    

    Ohne unset() ergibt sich so etwas:

    1231145406.5711: a1 erstellt
      1231145406.5712: a2 erstellt
      1231145406.5712: a1 aufgeräumt
      1231145409.5700: Ende
      1231145409.5701: a2 aufgeräumt

    Mit unset() hingegen:

    1231145451.7106: a1 erstellt
      1231145451.7107: a1 aufgeräumt
      1231145451.7107: a2 erstellt
      1231145454.7088: Ende
      1231145454.7089: a2 aufgeräumt

    Der Unterschied ist, dass im ersten Fall das Objekt a2 über seinen Konstruktor erstellt wird, anschließend erfolgt die Zuweisung zur Variable $a, wodurch auf das bisherige Objekt a1 nun nichts mehr verweist und es aufgeräumt wird. Der Fall mit unset() dürfte klar sein.

    [1] siehe hierzu auch das PDF-Dokument bei References Explained (by Derick Rethans)

    echo "$verabschiedung $name";