dedlfix: Klasse zerstören?

Beitrag lesen

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";