PHP OOP Objekt soll sich selber zerstören

Xot

-
ID: 413078
L
26 November 2006
451
36
Hallo zusammen,

ich versuche ein Object sich selbst zum "zerstören" zu bringen...

Ich habe folgenden Code:
PHP:
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".

PHP:
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:
Code:
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?
 
Schau Dir mal das Beispiel hier an (copy von https://de.php.net/manual/de/function.unset.php)

PHP:
if you try to unset an object, please be careful about references.

Objects will only free their resources and trigger their __destruct method when *all* references are unsetted.
Even when they are *in* the object... sigh!

<?php

class A {
  function __destruct() {
    echo "cYa later!!\n";
  }
}

$a = new A();
$a -> a = $a;
#unset($a); # Just uncomment, and you'll see

echo "No Message ... hm, what now?\n";
unset($a -> a);
unset($a);

echo "Finally that thing is gone\n";

?>

Of course the object completely dies at the end of the script.

Vielleicht hilft es Dir, Dein Problem zu verstehen.
Wenn Du Deine Klasse hier nicht als Code mit einhängst, wird es uns schwer fallen, Dir den richtigen Tip zu geben ;)
 
Zuletzt bearbeitet:
huhu Xot :)ugly:),
ein Objekt kann sich in PHP nicht selbst zerstören ;)
Du programmierst in einer Sprache mit automatischer Speicherverwaltung, in C könntest du soetwas machen, aber nicht in PHP.
Ein Objekt wird nur und wirklich nur gelöscht, wenn keine Referenz mehr auf dieses zeigt, denn dann kommt der Garbage Collector und entfernt dieses.

Du könntest aber in der wakeup-Methode ein Flag setzen, dass dieses gelöscht werden soll, dann müsste jeder, der eine Referenz zu diesem Obejkt hat, das Flag prüfen und möglicherweise die Referenz löschen.

Intelligenter wäre es aber das Objekt als eine Art Singleton zu behandeln, das Objekt ist immer in der Session vorhanden, teilweise im uninitialisierten Zustand, teilweise mit Daten gefüllt. Solltest du nun das Objekt "zerstören" wollen, setzt du es einfach auf den uninitialisierten Zustand und fertig.
 
Du könntest aber in der wakeup-Methode ein Flag setzen, dass dieses gelöscht werden soll, dann müsste jeder, der eine Referenz zu diesem Obejkt hat, das Flag prüfen und möglicherweise die Referenz löschen.
So in etwa habe ich das 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 einfach ausserhalb die Referenz.

Über __wakeup() wäre zwar schöner aber was solls :ugly:

eine Art Singleton zu behandeln
Singleton ist leider keine Lösung da ich noch andere Instanzen des Objectes brauche :(
 
trotzdem wird das Objekt nicht zerstört, der Destruktor ist auch nur eine Routine um noch bestimmte Dinge aufzuräumen.