Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozpakowanie obiektu do istniejącej instancji klasy
Forum PHP.pl > Forum > PHP
WebCM
  1. <?php
  2. class Auth
  3. {
  4. private $id;
  5. private $name;
  6. private $surname;
  7. private $groupID;
  8. private $groupName;
  9. public function __construct()
  10. {
  11. // To spowoduje utworzenie NOWEJ instancji klasy Auth
  12. unserialize($_SESSION['AUTH']);
  13. // Tymczasem chcę, aby własności obiektu zostały rozpakowane
  14. // Do bieżącej instancji klasy Auth, czyli $this
  15. }
  16. public function isLoggedIn(){}
  17. public function login($login, $pass)
  18. {
  19. $pdo->query()->fetch(PDO::FETCH_INTO, $this);
  20. //jeśli dane się zgadzają, trzeba zapisać je do sesji
  21. $_SESSION['AUTH'] = serialize($this);
  22. }
  23. }
  24.  
  25. // 1. W pliku index.php tworzę tylko instancję klasy Auth
  26. $auth = new Auth;
  27. // 2. Klasa wykrywa zalogowanego użytkownika sama
  28. // 3. W pliku index.php sprawdzam to tak:
  29. if($auth->isLoggedIn())
  30. {
  31. /* jest OK */
  32. }
  33. else
  34. {
  35. /* musisz zalogować się */
  36. }
  37. // 4. Podstrona logowania ma po prostu wywołać metodę
  38. if($auth->login($login, $pass)) {} else {}
  39. // 5. Metoda login() zapisuje użytkownika w celu ponownego użycia w kolejnych żądaniach
Jak rozpakować obiekt, aby nie tworzyć nowej instancji klasy, lecz uaktualnić istniejącą już instancję? Może jest inny sposób, aby kod działał wg powyższych zasad?
irmidjusz
źle kombinujesz
spróbuj inaczej, np. metodą statyczną Auth::getInstance()
Crozin
Mechanizm (de)serializacji w PHP jest bardzo sztywny i ciężko zmienić sposób jego zachowania. Jednak, w tym przypadku problem leży gdzie indziej. Dlaczego po prostu nie zdeserializujesz obiektu poza obiektem typu Auth? Czemu koniecznie chcesz to robić w konstruktorze?

PS. "Auth" - taka nazwa kompletnie nie oddaje charakteru klasy.
marcio
Hmm a czy __sleep() tutaj nie pomoze? http://php.net/manual/en/oop4.magic-functions.php

Jesli nie to tak jak mowi @crozin serializuj ten obiekt poza klasa wink.gif
lukaskolista
Singleton - powinno wystarczyc
Crozin
@marcio: Auth::__sleep()/__wakeup() zostałoby wykonane na (zde)serializowanym obiekcie, a nie obiekcie wykonującym (de)serializację.
@lukaskolista: Nie dość, że sugerujesz użycie potworka, to w dodatku kompletnie mija się to z celem. wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.