Ein Experiment
10. Januar 2008 – 16:08Gestern fragte ich mich beim Einschlafen: Was ist, wenn ich eine Objektmethode aufrufe, welches eine andere Methode aufruft, welche das Objekt zerstört? Stürzt PHP ab oder läuft es einfach weiter. Was soll es dannn tun? Das Ergebnis hat mich überrascht:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | class Helper { public $blubb = true; public function Bye() { global $c; echo "Helper::Bye(): Calling Control::Kill()\n"; $c->Kill(); $c->End(__CLASS__); var_dump($this); } } class Control { public $obj = null; public function __construct() { echo "Control::__construct(): Making object of Helper...\n"; $this->obj = new Helper; } public function Kill() { echo "Control::Kill(): Good bye Helper\n"; unset($this->obj); $this->obj = null; } public function End($caller) { echo "Control::End(): Called by {$caller}\n"; if ( is_object($this->obj) && get_class($this->obj) == 'Helper' ) { echo "Object exists\n"; } else { echo "Object not exists\n"; } } } $c = new Control; $c->obj->Bye(); $c->End('main'); |
Kurz erklärt: Zuerst erstelle ich eine neue Instanz von Control, welche in seine Eigenschaft $obj eine Instanz von Helper erstellt. Dann rufe ich die Instanz von Helper auf, welche Control den Befehl gibt den Helfer zu zerstören.
Nun die Ausgabe, man beachte den fetten Teil:
michael@michfrm-home:~/Desktop$ php badstack.php
Control::__construct(): Making object of Helper…
Helper::Bye(): Calling Control::Kill()
Control::Kill(): Good bye Helper
Control::End(): Called by Helper
Object not exists
object(Helper)#2 (1) {
["blubb"]=>
bool(true)
}
Control::End(): Called by main
Object not exists
Obwohl das Objekt nicht mehr existiert, kann es sich selber auslesen.
Ich kenne mich mit der PHP-Interna nicht so aus aber denke Folgendes: PHP löscht nicht direkt das Objekt sondern erst die Referenz und zerstört dann das Objekt, wenn es wirklich nicht mehr gebraucht werden kann. Wieder was gelernt. ![]()
2 Kommentare zu “Ein Experiment”
woran denkst du bitte vorm einschlafen???
werd mich auch langsam in die OOP reinlernen. nur bisher kann ich damit aber nix anfangen.
geschrieben von FearOfTheDark am 15. Jan, 2008
> woran denkst du bitte vorm einschlafen???
Siehe ein paar Zeilen weiter oben
geschrieben von Michael am 15. Jan, 2008