![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
wykorzystywałem ostatnio sesje do przechowywania obiektów i spostrzegłem bardzo ciekawe zachowanie PHP, tj. jeżeli zapiszę obiekt do sesji to przy jego dalszej modyfikacji niejawnie aktualizowany jest on w sesji. Czy ktoś jest w stanie wytłumaczyć jak działa ten mechanizm 'pod spodem'? Przygotowałem paczkę która prezentuje to zagadnienie: SessionRegistry.php
Manager.php
set.php
change.php
show.php
loader.php
Przepływ zdarzeń: 1. Uruchamiam set.php 2. Uruchamiam show.php 3. Wynik print_r: Kod Manager Object ( [new:Manager:private] => Array ( [0] => Worker Object ( [id:Worker:private] => 509b99e26056c ) [1] => Worker Object ( [id:Worker:private] => 509b99e26094d ) [2] => Worker Object ( [id:Worker:private] => 509b99e260d33 ) [3] => Worker Object ( [id:Worker:private] => 509b99e261148 ) [4] => Worker Object ( [id:Worker:private] => 509b99e261518 ) ) [good:Manager:private] => Array ( ) [bad:Manager:private] => Array ( ) ) Jak widać jest wszystko co powinno być. Manager utworzył instancje Workerów, i zapisał się do sesji - wynikiem jest uzupełniona tablica new. 4. Uruchamiam change.php (zwróćcie uwagę, że nie ma tam wywołania SaveToSession) 5. Ponownie uruchamiam show.php i tym razem na ekranie pojawia się coś takiego: Kod Manager Object ( [new:Manager:private] => Array ( ) [good:Manager:private] => Array ( [0] => Worker Object ( [id:Worker:private] => 509b99e26094d ) [1] => Worker Object ( [id:Worker:private] => 509b99e260d33 ) [2] => Worker Object ( [id:Worker:private] => 509b99e261d0e ) ) [bad:Manager:private] => Array ( [0] => Worker Object ( [id:Worker:private] => 509b99e26056c ) [1] => Worker Object ( [id:Worker:private] => 509b99e261148 ) ) ) Plik change.php zmienił obiekt, 'nie mówiąc nic o tym sesji', ale sesja 'sama zaktualizowała' jego stan... Czy nie powinno być przypadkiem tak, że sesja powinna utrzymywać 'pierwotny' stan obiektu? Bardzo proszę, w miarę możliwości, wytłumaczyć co się dzieje 'pod maską' tego przykładu. Z góry serdecznie dziękuję, Maciek Ten post edytował macq 8.11.2012, 13:29:03 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Obiekty przekazywane są przez referencje. Czyli jak ty z sesji pobierasz obiekt to tak naprawdę pobierasz jego referencję i wszelkie zmiany jakie robisz na tym obiekcie dotyczą zmian u źródła, czyli w tym przypadku w obiekcie zapisanym w sesji
![]() Jeśli chcesz pobrać klon obiektu, to musisz go poprostu sklonować przy użyciu CLONE ps: a na przyszłość nie generuj aż 15 próbek by nam coś pokazać. 3 wystarczą - nie trzeba wówczas pół godziny scrollować posta... ![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki nospor za info!
Właśnie rzuciłem okiem do pliku sesji po stronie serwera i w sumie po jego zawartości można było wydedukować sposób zachowania tego mechanizmu... ale to już wpadło mi do głowy dopiero po Twoim poście ![]() Jeszcze raz wielkie dzięki ![]() PS. Co do próbek - sorry, już tego błędu nie powtórzę ![]() Pozdrawiam serdecznie, Maciek |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 00:06 |