Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasy - serialize i unserialize, czyli klasa nie chce wrócić :(
kackoz
post
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 19.02.2006

Ostrzeżenie: (0%)
-----


Ostatnio napisałem sobie taki kod klasy PHP5:
  1. <?php
  2. class Test{
  3.  private $name;
  4.  private $string;
  5.  private $color;
  6.  
  7.  private function writeText($text){
  8. echo "<span style='color:".$this->color."'>".$this->name." : ".$text."<br></span>"; 
  9.  } 
  10.  
  11.  public function __construct($name){
  12. $this->name = $name;
  13. $this->color = "#".dechex(rand(0,90)).dechex(rand(0,255)).dechex(rand(0,255));
  14. $this->writeText("Dziękuje że mnie stworzyłeś!");
  15.  }
  16.  
  17.  public function __destruct(){
  18. $this->writeText("Żegnaj :/");
  19.  }
  20.  
  21.  public function __clone(){
  22. $this->writeText("Ooo! Ja mam klona!");
  23. $this->color = "#".dechex(rand(0,90)).dechex(rand(0,255)).dechex(rand(0,255));
  24.  }
  25.  
  26.  public function __sleep(){
  27. $this->writeText("Ojej! Możesz mnie teraz w pliku schować!");
  28. return $this;
  29.  }
  30.  
  31.  public function __wakeup(){
  32. $this->writeText("Jeee! Przywróciłeś mnie do życia!");
  33.  }
  34.  
  35.  public function rename($newname){
  36. $oldname = $this->name;
  37. $this->name = $newname;
  38. $this->writeText("Ojej zmieniłeś moje imię z ".$oldname." na ".$newname."!");
  39.  }
  40.  
  41.  public function say($text){
  42. $this->writeText($text);
  43.  }
  44.  public function randomColor(){
  45. $this->color = "#".dechex(rand(0,90)).dechex(rand(0,255)).dechex(rand(0,255));
  46. $this->writeText("Zmieniłeś mój kolor!");
  47.  }
  48. }
  49. $tst = new Test("Fanfarikus");
  50. $inny = new Test("Dziwak");
  51. $klon_tst = clone $tst; 
  52. $klon_tst->rename("Klon Fanfarikusa");
  53. $kopia_innego = clone $inny;
  54. $inny->say("Dzięki że mnie sklonowałeś ;)");
  55. $tst->randomColor();
  56. unset($inny);
  57. $tekstowy = serialize($klon_tst);
  58. $klon_tst->say("Hehe! Jestem ciągiem znaków w zmiennej ".'$tekstowy'."! Brzmie tak : ".$tekstowy);
  59. unset($klon_tst);
  60. $klon_tst = unserialize($tekstowy);
  61. print_r($klon_tst);
  62. //$klon_tst->say(":O");
  63. $tst->say(";)");
  64. ?>


Zwraca taki tekst:
Kod
Fanfarikus : Dziękuje że mnie stworzyłeś!
Dziwak : Dziękuje że mnie stworzyłeś!
Fanfarikus : Ooo! Ja mam klona!
Klon Fanfarikusa : Ojej zmieniłeś moje imię z Fanfarikus na Klon Fanfarikusa!
Dziwak : Ooo! Ja mam klona!
Dziwak : Dzięki że mnie sklonowałeś;)
Fanfarikus : Zmieniłeś mój kolor!
Dziwak : Żegnaj :/
Klon Fanfarikusa : Ojej! Możesz mnie teraz w pliku schować!
Klon Fanfarikusa : Hehe! Jestem ciągiem znaków w zmiennej $tekstowy! Brzmie tak : O:4:"Test":3:{s:16:"Klon Fanfarikusa";N;N;s:7:"#4661cb";R:2;}
Klon Fanfarikusa : Żegnaj :/
: Żegnaj :/
Fanfarikus :;)
Fanfarikus : Żegnaj :/
Dziwak : Żegnaj :/


No i jest problem sad.gif. Jak wywołuje Serialize wszystkie zmienne są w ciągu znaków, ale gdy wywołuje unserialize funkcja __wakeup nie wywołuje się bo zmienna nie jest obiektem. Czy jest jakiś spodób na przywrócenie zserializowanej klasy?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Oczywiscie że się da, jednak jesli klasa ma metodę __sleep() to musisz pamietac, by ta metoda zwrocila, tablicę zmiennych, ktore mają byc zserializowane, inaczej sie wykrzaczy.

Tu masz kod:
  1. <?php
  2. public function __sleep(){
  3. echo '<p>Jakies akcje przed serializacjią obietku</p>';
  4. return(array_keys(get_object_vars($this)));
  5. }
  6. ?>


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kackoz
post
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 19.02.2006

Ostrzeżenie: (0%)
-----


A czy jest jakaś "magiczna" metoda, podobna do __destruct, ale wywoływana tylko wtedy kiedy używamy unset dla jakiejś Klasy np:
  1. <?php
  2. $a = new JakasKlasa();
  3. unset($a)
  4. ?>

Czyli żeby kiedy jest unset dla całego obiektu wywoływał tą określoną funkcję.

A tamten kod już działa dobrze winksmiley.jpg Dzięki nospor tongue.gif
Go to the top of the page
+Quote Post
hwao
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




http://forum.php.pl/index.php?s=&showt...st&p=287709

Do obiektu raczej nie (chociaz nie sprawddalem) ale do wlasciwosci tak

Jak zrobisz unset() obiektu to powinien sie wlaczyc destruktor
Go to the top of the page
+Quote Post
kackoz
post
Post #5





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 19.02.2006

Ostrzeżenie: (0%)
-----


Mi chodzi jedynie gdy wywołuje się unset, ale nie pod koniec wysyłania kodu do przeglądarki :|
Go to the top of the page
+Quote Post
Fipaj
post
Post #6





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 19.01.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Haha, nikt jeszcze (!) nie zapoznał się z NOWYMI METODAMI MAGICZNYMI w php 5.1 biggrin.gif

sprawdźcie sobie metody: __isset(), __unset() i __set_state biggrin.gif

http://pl2.php.net/manual/pl/language.oop5.magic.php

edited:

@hwao: przeprosił. smile.gif

Ten post edytował Fipaj 28.08.2006, 19:23:40


--------------------
Go to the top of the page
+Quote Post
hwao
post
Post #7


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Cytat(kackoz @ 28.08.2006, 11:40 ) *
Mi chodzi jedynie gdy wywołuje się unset, ale nie pod koniec wysyłania kodu do przeglądarki :|


Prosze Pana, wypadalo by wpierw sprawdzic a nie odrazu pisac w takim tonie.

  1. <?php
  2. class foo {
  3. public function __destruct() {
  4. echo __METHOD__.PHP_EOL;
  5. }
  6. }
  7.  
  8. $Foo = new Foo();
  9.  
  10. unset( $Foo );
  11.  
  12. echo 'Now'.PHP_EOL;
  13.  
  14. ?>


Efekt

Kod
foo::__destruct
Now


  1. <?php
  2. $Foo = new Foo();
  3. echo 'Now'.PHP_EOL;
  4. ?>

Efekt (tak bedzie);
Kod
Now
foo::__destruct



Cytat(Fipaj @ 28.08.2006, 12:15 ) *
Haha, nikt jeszcze (!) nie zapoznał się z NOWYMI METODAMI MAGICZNYMI w php 5.1 biggrin.gif

sprawdźcie sobie metody: __isset(), __unset() i __set_state biggrin.gif


Jakbys byl laskawy chociaz popatrzec na linka ktorego podalem. Swoja droga te mm sa opisane tutaj
Go to the top of the page
+Quote Post
kackoz
post
Post #8





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 19.02.2006

Ostrzeżenie: (0%)
-----


Chodziło mi o to żeby robiło co innego gdy się unsetuje, a co innego gdy php je usuwa aby zwolnić pamięć.
Go to the top of the page
+Quote Post
bigZbig
post
Post #9





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@kackoz - zamiast robic unset($object) stworz metode $object->unset(), ktora przed destrukcja obiektu wykona jeszcze jakies dodatkowe dzialania. Mozesz tez zrobic metode $object->preunset(), ktora bedziesz wykonywal przed usunieciem obiektu metoda unset. Byc moze mozna ten proces zautomatyzowac przy pomocy metod magicznych wspomnianych wyzej przez kolegow (nie zapoznalem sie z nimi jeszcze). Jesli tak napisz tutaj rozwiazanie.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
hwao
post
Post #10


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Nie wiem po jaka cholere Ci to, ale napisalem cos takiego...

  1. <?php
  2.  
  3. class Ctrl {
  4. static protected $bEnded = false;
  5.  
  6. static public function EndOfScript() {
  7. echo '<p>Koniec skryptu</p>'."n";
  8. self::$bEnded = true;
  9. }
  10.  
  11. static public function isEnded() {
  12. return self::$bEnded;
  13. }
  14. }
  15.  
  16. register_shutdown_function( array( 'Ctrl', 'EndOfScript' ) );
  17.  
  18. class foo {
  19. public function __destruct() {
  20. if( Ctrl::isEnded() ) {
  21. echo '<p>Usuniete z pamieci</p>'."n";
  22. } else {
  23. echo '<p>Usuniete przez unset()</p>'."n";
  24. }
  25. }
  26. }
  27.  
  28. $Foo = new Foo();
  29. unset( $Foo );
  30.  
  31. $Bar = new Foo();
  32.  
  33. ?>

elefkt:
Kod
<p>Usuniete przez unset()</p>
<p>Koniec skryptu</p>
<p>Usuniete z pamieci</p>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 14:21