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 |
|
|
|
macq PHP aktualizuje zserializowany w sesji obiekt 8.11.2012, 12:42:56
nospor Obiekty przekazywane są przez referencje. Czyli ja... 8.11.2012, 13:02:22
macq Dzięki nospor za info!
Właśnie rzuciłem okiem... 8.11.2012, 13:36:27 ![]() ![]() |
|
Aktualny czas: 24.12.2025 - 02:54 |