Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z przeniesieniem obiektu klasy w sesji
Forum PHP.pl > Forum > PHP
neverever
Mam sobie obiekt swojej klasy i chce go przekazac w sesji.
Serializuję go, zapisuję w zmiennej sesyjnej ....potem deserializuję przy wczytywaniu z sesji.

Było by ok, ale wywala mi błędy gdy chce na takim obiekcie operować.

Dostaję takiego oto warninga
Cytat
Warning: curl_close() expects parameter 1 to be resource, integer given in ping_classs.php on line 231


Zgaduję, że problemem jest zagnieżdżenie obiektów? tego obiektu curla będącego w środku nie przetwarza?

Pytanie, jak temu zaradzić?
-=Peter=-
Zasobów nie da się serializować, a najwidoczniej w tym obiekcie masz uchwyt curla.

Rozwiązanie to zamykanie zasobu w metodzie serialize (ew. __sleep), a tworzenie go na nowo w metodzie unserialize (ew. __wakeup).
neverever
Cytat(-=Peter=- @ 21.02.2010, 23:36:41 ) *
Zasobów nie da się serializować, a najwidoczniej w tym obiekcie masz uchwyt curla.

Rozwiązanie to zamykanie zasobu w metodzie serialize (ew. __sleep), a tworzenie go na nowo w metodzie unserialize (ew. __wakeup).

tak, mam w środku uchwyt curla trzymany public $curl;

Czy mogę prosić o bardziej szczegółowe wyjaśnienie sposobu rozwiązania? Bo niestety niewiele zrozumiałem.

Znaczy uchwytu nie da rady w w żaden sposób przekazać, czy tak? Jedynie zamknąć i otworzyć na nowo?
-=Peter=-
Chodzi o to, że zasobów nie da się serializować, czyli uchwyt curla który jest zewnętrznym natywnym zasobem nie może być zserializowany.

  1.  
  2. class A implements Serializable
  3. {
  4. protected $curl;
  5. public function __construct()
  6. {
  7. $this->curl = curl_init(...);
  8. }
  9.  
  10. //metoda która jest wywoływana, gdy chcesz serializować ten obiekt
  11. public function serialize()
  12. {
  13. echo __METHOD__;
  14. }
  15.  
  16. //metoda wywoływana gdy obiekt jest deserializowany
  17. public function unserialize($data)
  18. {
  19. //odtwarzasz uchwyt curla, gdyż on nie może być serializowany
  20. $this->curl = curl_init(...);
  21. echo __METHOD__;
  22. }
  23. }
  24.  
  25. $obj = new A();
  26. $s = serialize($obj);
  27. $obj2 = unserialize($s);

Cytat
Znaczy uchwytu nie da rady w w żaden sposób przekazać, czy tak? Jedynie zamknąć i otworzyć na nowo?

Tak, tylko nie wiem czy w Twoim przypadku zamknięcie uchwytu będzie dobrym pomysłem, to zależy czy po serializacji w aplikacji jest nadal używany obiekt, który jest serializowany, jeśli nie to możesz to połączenie zamknąć.
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.