OOP Objekt selbst zerstören
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aufruf
aufrufen
aufwachen
ausprobieren
berechtigung
code
datum
eigentliche instanz
instanz
not
null
objekt
pointer
probier
referenz
rufen
session
solls
tod
unbefugter zugriff
-
Hallo zusammen,
ich versuche ein Object sich selbst zum "zerstören" zu bringen...
Ich habe folgenden Code:
if (!isset($_SESSION['guest'])) { $_SESSION['guest'] = new Guest(); }
Wenn in der Session noch kein Objekt erstellt ist soll ein neues erstellt werden.
Nun will ich die Session noch besser absichern. Sollte das Objekt wieder "aufwachen" auf einer neuen Seite soll überprüft werden ob im Cookie der richtige Hash ist. Sollte dies nicht der Fall sein soll sich das Objekt selber "zerstören".
public function __wakeup() { if (isset($_COOKIE['hash'])) { if ($this->getHash() == $_COOKIE['hash'] && $this->getGuestIP() == StaticFunctions::getUserIP()) { if (isset($_GET['p'])) { $this->setPage($_GET['p']); } else { $this->setPage(0); } } else { unset($this); } } else { unset($this); } }
Das unset($this) bringt keinen Effect. Auf das Objekt kann weiterhin zugegriffen werden. Ein $this = null; bricht mit der Fehlermeldung ab:
Fatal error: Cannot re-assign $this in /var/customers/webs/usr01/search/class/Guest.php on line 58
Hat sonnst jemand von euch eine Idee wie man das lösen kann?
nikic: [code]-Tags korrigiert. Wir haben kein [php], nur [code] ;)
Beitrag zuletzt geändert: 20.4.2010 15:35:54 von nikic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Da man den Konstruktor ein zweites Mal aufrufen kann, gehe ich davon aus dass es auch beim Destruktor geht.
Bin mir aber keineswegs sicher, musst du ausprobieren ($this->__destruct();) -
@fr3z3ryo mey
du denkst viel zu kompliziert. das beispiel sagt alle s zu der lage:
zum test, kannst zeile 10 auskommentieren, dann siehst was passiert. also kurz: ein objekt löst sich am besten auf mit unset (wird auch von php.net propagiert). wenn es dadurch nicht klar wird, musst du leider tut lesen.<?php // czibere.lima-city.de/_forum/fr3z3r/destruct.php error_reporting (E_ALL); session_start (); echo $_SESSION['O'] = new CClass; // erste möglichkeit (ist die richtige): $line = (__LINE__ + 1); unset ($_SESSION['O']); // destruct !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // $_SESSION['O']->__tostring (); // das kann hier nicht mehr gehen !!!!!!!!!!!! $line = (__LINE__ + 1); if ( isset ($_SESSION['O']) ) $_SESSION['O']->__destruct (); exit; class CClass { public $var = "CClassVar"; public function __construct () { echo "<h>construct CClass</h4>"; } public function __tostring () { return "<pre><strong>CClass:</strong>\n".print_r($this,true)."</pre>"; } public function __destruct () { global $line; echo "<h4>destruct CClass from Line# $line</h4>"; // zweite möglichkeit ist unnötig (zerstört sich 2 mal!) unset ($this); } } ?>
-
@czibere: Dem Threadersteller geht es darum, die Instanz der Klasse bereits beim __wakeup zu zerstören.
Das wird jedoch seit PHP 5 nicht mehr gehen. Ein Aufruf von __destruct() wird einfach die __destruct-Methode aufrufen, die Instanz aber nicht zerstören. unset($this) geht seid PHP5 nicht mehr. Das liegt daran, dass in PHP5 keine Variable die eigentliche Instanz enthält, sondern nur Pointer auf diese Instanz. Deshalb passiert beim unsetten von $this schlichtweg nichts. -
Vielleicht hilft dir das:
class A { function __construct() { } function destroy() { // this would not work: // unset($this); // but this: settype(&$this, 'null'); } } $objA = new A(); var_dump($objA); // Object... $objA ->destroy(); var_dump($objA); // NULL !!!
Probier mal
stattsettype(&$this, 'null');
.unset($this);
-
nikic schrieb:
und ich war mir nicht ganz sicher, daher nochmals hausaufgabe gemacht: __wakeup ist eigentlich für datenwiederherstellung gedacht und nicht dafür dass sich selbst mitsamt eigene klasse in den tod schickt (laut tut und noch so paar quellen).
@czibere: Dem Threadersteller geht es darum, die Instanz der Klasse bereits beim __wakeup zu zerstören. -
@wagnerm: Wird seid PHP5 genauso wenig gehen ;) Man zerstört immer nur den Pointer, nicht die Instanz.
@czibere: Aha. -
@czibere: Es geht auch um Datenwiederherstellung. Doch dabei will ich das ganze durch einen Sicherheitscheck laufen lassen, damit kein unbefugter Zugriff auf das Objekt bekommt... Somit: Falls Sicherheitscheck ungültig -> Destroy ansonnsten Daten laden...
Ich habs nun etwa so gelöst:
Falls die Session vorhanden ist rufe ich als erstes eine Function auf, die überprüft ob die Berechtigung für dieses Object richtig ist, welche mir true bzw. false liefert. Bei false lösche ich ausserhalb die Referenz.
Über __wakeup() wäre zwar schöner aber was solls ^^ -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage