Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Sesja, a obiekt
Forum PHP.pl > Forum > Przedszkole
arszawin
  1. $_SESSION[temp] = new Obiekt();
  2. $_SESSION[temp]->metoda();


Czy taki zapis jest poprawny? Nie wiem dlaczego pojawia się błąd:
Cytat
Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition &quot;Kupon&quot; of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in
Pawel_W
a słyszałeś o serializacji? guitar.gif

serialize

http://pl.php.net/manual/pl/language.oop5.serialization.php
arszawin
Przyznam, że zrozumienie serializacji sprawia mi trochę problemu.
  1. <?php
  2. require_once("obiekt.php");
  3.  
  4. if ( !isset ( $_SESSION[ob] ) ) {
  5. $_SESSION[ob] = new Obiekt();
  6. }
  7.  
  8. $_SESSION[ob] -> dodajObiekt(1);
  9. echo $_SESSION[ob] -> liczbaObiektow();
  10. ?>

W przypadku, gdy sesja nie istnieje, zostanie ona utworzona i kod wykona się poprawnie. W drugim przypadku - pojawi się błąd, o którym wcześniej wspomniałem. Klasa Obiekt, która jest importowana i której instancja jest przechowywana w sesji bazuje na liście ArrayList, którą sam implementowałem.

Co powinienem serializować, a następnie odserializować, by odczyt obiektu z sesji był poprawny?

Wydawało mi się, że będzie to na wzór tego:
  1. if ( !isset ( $_SESSION[ob] ) ) {
  2. $_SESSION[ob] = serialize ( new Obiekt() );
  3. }
  4.  
  5. $_SESSION[ob] = serialize ( unserialize ( $_SESSION[ob] ) -> dodajObiekt (1) );
  6. echo unserialize ( $_SESSION[ob] ) -> liczbaObiektow();

ale teraz mamy błąd:
Cytat
Fatal error: Call to a member function dodajObiekt() on a non-object in ...
wookieb
To co miałeś na początku było dobre. Problem polega na tym, że próba odserializowania ciągu w innym skrypcie nie powiodła się ponieważ plik z potrzebną klasą nie został dołączony do skryptu.
Przykład
  1. class test
  2. {
  3. public function foo(){ return 'foo'; }
  4. }
  5.  
  6. $test = new test();
  7. $_SESSION['test'] = $test;



Drugi skrypt
  1. require_once 'test.php'; // sama definicja klasy test
  2. $_SESSION['test']->foo();

Zadziała już ok. Można z tego problemu wybrnąć poprzez stosowanie autoloaderów.
arszawin
Cytat
To co miałeś na początku było dobre

Masz na myśli ten kod?
  1. <?php
  2. require_once("obiekt.php");
  3.  
  4. if ( !isset ( $_SESSION[ob] ) ) {
  5. $_SESSION[ob] = new Obiekt();
  6. }
  7.  
  8. $_SESSION[ob] -> dodajObiekt(1);
  9. echo $_SESSION[ob] -> liczbaObiektow();
  10. ?>

Napisałeś, że przyczyną problemów jest to, że plik z potrzebną klasą nie został dołączony do skryptu. Chyba jednak nie rozumiem - w trzeciej linijce mamy przecież require_once("obiekt.php");. Problem jest, gdy do sesji przypisany jest już jakiś obiekt klasy Obiekt - wtedy faktycznie jest jakiś problem z odczytem tego obiektu. Pawel_W w pierwszym poście zasugerował użycie serialize(), Ty wspomniałeś o autoloaderze(?) - teraz już nie wiem, co muszę zrobić, by wyeliminować błąd i liczbaObiektów przy każdym odświeżeniu była poprawnie inkrementowana;)
wookieb
1)
  1. $_SESSION['ob'];

2) Jaki masz błąd?
3)
  1. require_once("obiekt.php");

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.