kostenloser Webspace werbefrei: lima-city


OOP Objekt selbst zerstören

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fr3z3r

    fr3z3r hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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();)
  4. @fr3z3r
    yo mey
    du denkst viel zu kompliziert. das beispiel sagt alle s zu der lage:
    <?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);
      }
    }
    
    ?>
    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.
  5. @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.
  6. 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
    settype(&$this, 'null');
    statt
    unset($this);
    .
  7. nikic schrieb:
    @czibere: Dem Threadersteller geht es darum, die Instanz der Klasse bereits beim __wakeup zu zerstören.
    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).
  8. @wagnerm: Wird seid PHP5 genauso wenig gehen ;) Man zerstört immer nur den Pointer, nicht die Instanz.

    @czibere: Aha.
  9. Autor dieses Themas

    fr3z3r

    fr3z3r hat kostenlosen Webspace.

    @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 ^^
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!