![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 19 Dołączył: 25.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam następujący kod:
Kod <?php class MyObj { public $property = 1; } session_start(); // inicjalizacja $obj = new MyObj; $variable = 'a'; // zapis do sesji $_SESSION['obj'] = $obj; $_SESSION['var'] = $variable; // zmiana wartosci $obj->property = 2; $variable = 'b'; // odczyt z sesji $o = $_SESSION['obj']; $v = $_SESSION['var']; // wyjscie echo 'wlasciwosc obiektu: '. $o->property; echo '<br>'; echo 'zmienna: '.$v; a na wyjściu programu: wlasciwosc obiektu: 2 zmienna: a Można zaobserwować, że zwykła zmienna oraz obiekt zachowują się przy zapisie do sesji nieco inaczej. Pytania: 1) Dlaczego nie wyświetliło się wlasciwosc obiektu: 1? 2) Czy zapis obiektu w sesji polega na zapisie w niej referencji do obiektu? 3) Czy w związku z tym można zapisać obiekt w sesji na samym początku skryptu, a potem dowolnie go zmieniać bo i tak wszystkie zmiany zostaną odnotowane w sesji? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Obiekty przekazywa są jako referencje, dlatego zmiana w jednym miejscu danego obiektu powoduje "zmiany" tez w innych. To jest odpowiedzią na Twoje wszystkie 3 pytania.
Zas zwykle zmienne przekazywany są jako wartosci. ps: sytuacja rzecz jasna nie dotyczy tylko sesji. Zawsze obiekty przekazywane są jako referencja, niezaleznie gdzie je przekazujesz. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Technicznie rzecz biorąc nospor trochę rozminą się z prawdą.
W PHP wszystko domyślnie przekazywane jest na zasadzie kopiowania (pass-by-value), nie referencji (pass-by-reference) - dokładnie to samo dotyczy obiektów. W Twoim przykładzie zmienna $obj nie jest bezpośrednio obiektem klasy MyObj, a czymś w rodzaju wskaźnika do tego obiektu. Przy zapisie $_SESSION['obj'] = $obj; dochodzi do skopiowania, ale nie obiektu, a właśnie tego wskaźnika - na dobrą sprawę jest to zachowanie identyczne z $_SESSION['var'] = $variable;. Jednak nie są to referencje, zmiana wartości $_SESSION['obj'] ([i]$_SESSION['obj'] = new MyOtherObj()) nie zmieni zawartości $obj. Dokładnie takie samo zachowanie obserwujemy przekazując jakiś obiekt jako argument funkcji. Do poczytania: http://www.php.net//manual/en/language.oop5.references.php Cytat Czy w związku z tym można zapisać obiekt w sesji na samym początku skryptu, a potem dowolnie go zmieniać bo i tak wszystkie zmiany zostaną odnotowane w sesji? Tak.PS. Jeżeli obiekt ma być serializowany dobrze by było by implementował interfejs Serializable. |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Czlowiek uzywa skrotu myslowego by nie motac początkujacym a ten z wykladem na 3 strony wyjezdza (IMG:style_emoticons/default/wink.gif) Dobrze że nie podales kodu assemblera do tego (IMG:style_emoticons/default/wink.gif)
joke of course (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 19 Dołączył: 25.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
PS. Jeżeli obiekt ma być serializowany dobrze by było by implementował interfejs Serializable. Serializowany gdzieś poza sesją jeszcze rozumiem. Bo w przypadku sesji wystarczą mi metody __sleep() i __wakeup(). Tak? |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
__sleep() i __wakeup() działają nieco inaczej od implementacji Serializable i obie metody nie są wymienne:
- http://www.php.net//manual/en/language.oop...op5.magic.sleep - http://www.php.net/manual/en/class.serializable.php |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 00:49 |