OOP, Instanz ordentlich vernichten
Tom
- php
0 Benjamin Wilfing0 Tom
Hello,
wie kann ich bei PHP eine Instanz einer Klasse ordentlich vernichten?
Ich möchte also, dass die Instanz beim Aufruf "vernichte dich" alle Arbeiten abschließt, die noch offen waren, und sich dann aus dem Speicher entfernt.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi Tom,
wie kann ich bei PHP eine Instanz einer Klasse ordentlich vernichten?
in PHP5 mit __destruct. PHP4 kennt, soweit ich weiß, keine Destruktoren (man möge mich korrigieren), aber das will man ja sowieso nicht mehr benutzen.
Viele Grüße
Benjamin
Hello,
wie kann ich bei PHP eine Instanz einer Klasse ordentlich vernichten?
in PHP5 mit __destruct. PHP4 kennt, soweit ich weiß, keine Destruktoren (man möge mich korrigieren), aber das will man ja sowieso nicht mehr benutzen.
Ich bin bei OOP immer noch schwer belastet aus den Tagen von Assembler.
Da musste man an alles selber denken, sonst war der Speicher irgendwann alle.
Wenn ich jetzt in einer Funktion eine Instanz erzeuge, was passiert mit der Instanzvariablen, wenn die Funktion endet? Wird sie wie eine Variable entfernt, oder bleibt sie wie ein Handle erhalten?
Ich hoffe ersteres...
Und in einer Schleife?
Kann ich sie einfach überschreiben?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi Tom,
Wenn ich jetzt in einer Funktion eine Instanz erzeuge, was passiert mit der Instanzvariablen, wenn die Funktion endet? Wird sie wie eine Variable entfernt, oder bleibt sie wie ein Handle erhalten?
ich bin auch weder eine PHP-Koryphäe, noch studiere ich Informatik oder so, ganz intuitiv hätte ich aber gesagt, dass sie wie eine Variable zerstört wird. Folgender Codeschnipsel gibt mir dabei recht:
<?php
class Test {
function __construct() {
echo "Klasse wurde instantiiert.\n";
}
function __destruct() {
echo "Klasse wurde zerstört.\n";
}
}
function testDestructor() {
$test = new Test();
}
header('Content-Type: text/plain');
testDestructor();
?>
gibt folgendes aus:
Klasse wurde instantiiert.
Klasse wurde zerstört.
Und in einer Schleife?
Kann ich sie einfach überschreiben?
In der Funktion? Vermutlich ja, aber ich habe es nicht getestet. Oder vielleicht verstehe ich dich falsch ;-)
Viele Grüße
Benjamin
echo $begrüßung;
[...] ganz intuitiv hätte ich aber gesagt, dass sie wie eine Variable zerstört wird. Folgender Codeschnipsel gibt mir dabei recht:
[...]
function testDestructor() {
$test = new Test();
}testDestructor();
?>
Das ist noch nicht der Beweis, dass der Destruktor am Funktionsende aufgerufen wurde. Da sofort danach das Script endete, kann das Aufräumen auch erst zu diesem Zeitpunkt stattgefunden haben. Ein flush() im Destruktor und etwas sleep() vor dem Scriptende sollte da ein eindeutigeres Ergebnis liefern. (Es sei denn, man testet das im Opera, der mag anscheinend so kleine Datenschnipselchen nicht sofort ausgeben. Bei einem anderen Test neulich hat er sie erstmal gesammelt.)
Ich denke (und hoffe) aber, dass du trotzdem recht behältst. Leider kann ich es im Moment nicht prüfen, da der IIS mit CGI-PHP flush() nicht richtig mag.
echo "$verabschiedung $name";
Hi dedlfix,
Das ist noch nicht der Beweis, dass der Destruktor am Funktionsende aufgerufen wurde. Da sofort danach das Script endete, kann das Aufräumen auch erst zu diesem Zeitpunkt stattgefunden haben.
das ist mir auch aufgefallen, nachdem ich das Posting bereits abgesetzt hatte. Ich habe zum Testen einfach nach dem Funktionsaufruf eine weitere Ausgabe erfolgen lassen, diese erschien *nach* der Meldung, dass die Klasse zerstört wurde. Das sollte Beweis genug sein, oder irre ich?
Viele Grüße
Benjamin
echo $begrüßung;
Ich habe zum Testen einfach nach dem Funktionsaufruf eine weitere Ausgabe erfolgen lassen, diese erschien *nach* der Meldung, dass die Klasse zerstört wurde. Das sollte Beweis genug sein, oder irre ich?
Ja, ich denke, das ist ebenfalls eine ausreichende Methode.
echo "$verabschiedung $name";
Hello,
Ich habe zum Testen einfach nach dem Funktionsaufruf eine weitere Ausgabe erfolgen lassen, diese erschien *nach* der Meldung, dass die Klasse zerstört wurde. Das sollte Beweis genug sein, oder irre ich?
Ja, ich denke, das ist ebenfalls eine ausreichende Methode.
*mmmh*
Ich trau dem Braten noch nicht.
Ich will auf jeden Fall lost Handles vermeiden, an denen dann ja auch verlorenen Memory-Blöcke hängen können.
Heute habe ich den halben Zag nach verlorenem RAM gesucht im XAMPP-Paket unter Windows eXPerimental.
Leider funktionieren auch die Memeoryfunktionen unter Windows nicht.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Ich bin bei OOP immer noch schwer belastet aus den Tagen von Assembler.
Da musste man an alles selber denken, sonst war der Speicher irgendwann alle.
was hat assembler mit oop zu tun?????
was bedeutet objektinstanz vernichten?
wenn objektinstanzen keine referenzen mehr aufweisen, werden diese in php wie in java von der garbage collection verwaltet.
wie kann man eine referenz entfernen? z.b. durch zuweisung von null.
kann durch den destruktor ein objekt zerstört werden? nein!
der destruktor ist eine ereignisroutine, welche bei freigabe aufgerufen wird, um das objekt kontrolliert zu beenden. z.b. in der db zu speichern.
in php4 wird der destruktor nicht vom php-interpreter aufgerufen.
es hindert dich aber niemand daran, eine destruktormethode selbst vor dem 'vernichten' aufzurufen. z.b.
$o = new Objekt(...);
$o->destrukt(...);
$o = null;
Hallo.
was hat assembler mit oop zu tun?????
Mist, mein Browser ersetzt schon wieder irgendwelche Schrift- durch Fragezeichen.
MfG, at
Hello,
was hat assembler mit oop zu tun?
Unter Assenbler wurde die objektorientierte Programmierung erfunden.
Spätestens mit Borlands "Sidekick" hat man dann auch angefangen, das ganz intensiv auf 8086ern und ähnlichen zu verfolgen...
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom