Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasy - serialize i unserialize
Forum PHP.pl > Forum > PHP > Object-oriented programming
kackoz
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?
nospor
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. ?>
kackoz
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
hwao
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
kackoz
Mi chodzi jedynie gdy wywołuje się unset, ale nie pod koniec wysyłania kodu do przeglądarki :|
Fipaj
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
hwao
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
kackoz
Chodziło mi o to żeby robiło co innego gdy się unsetuje, a co innego gdy php je usuwa aby zwolnić pamięć.
bigZbig
@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.
hwao
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>
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.