Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tworzenie klas
Forum PHP.pl > Forum > Przedszkole
borpaw
Mam takie pytanie.
Robie dla mojej strony index.php w którym są tworzone obiekty przez "new"
  1. $db = new DBconnect(DB_HOST, DB_NAME, DB_USER, DB_PASS);
  2. $pages = new Pages();
  3. $init = new Init();

Wszystkie linki na stronie są kierowane na index.php?sub=N, czyli za każdym kliknieciem na stronie tworzą się przez new te same klasy.
Czy tak ma być? Czy to jest źle?
nospor
No raczej prawidłowo... zarówno zmienne jak i klasy nie są przenoszonę pomiędzy requestami
borpaw
Może ja to źle rozumiem, ale wypełniam zmienne klasy jakąś zawartością i chciałbym żeby ta zawartość nie znikała po każdym kliknięciu w link
Jak coś takiego zrobić. np klasa do logowania pamięta swoją zawarość a nie tworzy sie na nowo ciągle?
Crozin
1. Sesje.
2. Jeżeli do sesji chcesz wrzucić obiekty, powinny one być utworzone z klasy implementującej interfejs Serializable.
borpaw
Czyli są tylko dwa wyjścia albo zastosować sesje,
albo za każdym przeładowaniem strony wypełniać klasy na nowo?

Nie robi się tak że klasa jest łądowana tylko raz?
Crozin
PHP działa na zasadzie: żądanie HTTP z przeglądarki -> władowanie wszystkiego co potrzebne do jego przetworzenia -> zwrócenie odpowiedzi HTTP do przeglądarki -> zwolnienie wszystkich zasobów.
Wszystkich, w tym także sesji, dlatego są one zapisywane w jakiejś bazie danych, a obiekty przed zapisaniem muszą zostać zserializowane.
PanGuzol
Się podepnę z pytaniem bo na temat.

Z ciekawości co będzie jak nie użyję serialize i zapiszę obiekt w sesji no i mam kod

foo.php
  1. <?php
  2.  
  3. class foo {
  4.  
  5. public $a;
  6.  
  7. private $b;
  8.  
  9. public function setB($c)
  10. {
  11. $this->b = $c;
  12. }
  13.  
  14. public function getB()
  15. {
  16. return $this->b;
  17. }
  18. }
  19.  
  20. ?>


index.php
  1. <?php
  2.  
  3. include('foo.php');
  4. $o = new foo();
  5.  
  6. $o->a = 1;
  7. $o->setB(4);
  8. $_SESSION['test'] = $o; // lub clone $o;
  9. var_dump($_SESSION);
  10. ?>
  11. <a href="footest.php">test</a>
  12.  


footest.php
  1. <?php
  2.  
  3. include('foo.php');session_start();
  4. var_dump($_SESSION);
  5. echo $_SESSION['test']->getB();
  6. $_SESSION['test']->setB(7);
  7. echo $_SESSION['test']->getB();
  8. ?>


No i pomimo iż nie użyłem funkcji serialize/unserialize obiekt w sesji się znajduje z poprawnymi wartościami i działającymi metodami.
Crozin
Ponieważ PHP, a dokładniej domyślny mechanizm sesji, zawsze przed zapisem jej do pliku serializuje sobie tablicę $_SESSION. Także Ty sam nie musisz wrzucać do sesji zserializowanych danych, tylko upewnić się, że obiekty które do niej wrzucasz implementowały interfejs Serializable.

Sposób działania sesji, w uproszczeniu:
  1. $sid = 'dsadasxcvcxvcxsa'; // identyfikator sesji, np. z ciasteczka
  2.  
  3. // odczytanie danych
  4. $sessionFile = '/path/to/session/' . $sid;
  5. if (file_exisits($sessionFile) && time() - filemtime($sessionFile) < 60 * 30) {
  6. $_SESSION = unserialize(file_get_contents($sessionFile));
  7. }
  8.  
  9. // cały skrypt
  10.  
  11. // zapis danych
  12. file_put_contents($sessionFile, serialize($_SESSION));
PanGuzol
Tyle, że w moim przykładzie nie użyłem interfejsu Serializable
Crozin
W takim przypadku interpreter zserializuje każdą właściwość obiektu, nie pozostawiając Ci żadnej kontroli nad tym procesem. To z kolei może prowadzić do błędów, bądź niepożądanych efektów.
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.