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 561 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 (IMG:style_emoticons/default/smile.gif)
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... (IMG:style_emoticons/default/wink.gif) |
|
|
|
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 (IMG:style_emoticons/default/wink.gif) Jeszcze raz wielkie dzięki (IMG:style_emoticons/default/wink.gif) PS. Co do próbek - sorry, już tego błędu nie powtórzę (IMG:style_emoticons/default/wink.gif) Troszkę się już nawet zreflektowałem! Pozdrawiam serdecznie, Maciek |
|
|
|
![]() ![]() |
|
Aktualny czas: 25.12.2025 - 00:45 |