Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Zapis obiektu w sesji. Dziwne zachowanie.
qrzysztof
post
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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
nospor
post
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.
Go to the top of the page
+Quote Post
Crozin
post
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.
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
qrzysztof
post
Post #5





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Cytat(Crozin @ 13.06.2014, 08:10:34 ) *
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?
Go to the top of the page
+Quote Post
Crozin
post
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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 00:49