__serialize i __unserialize
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 49 z 91.
Gdy trzeba przekonwertować obiekt na ciąg znaków w celu zapisania lub przesłania, PHP używa serializacji. Magiczne metody __serialize() i __unserialize() pozwalają kontrolować, jakie dokładnie dane są zapisywane i jak są przywracane.
Metoda __serialize() zwraca tablicę danych do serializacji, a metoda __unserialize() otrzymuje tę tablicę i odtwarza obiekt:
<?php
class Session {
public function __construct(
private string $userId,
private array $data,
private int $createdAt
) {}
public function __serialize(): array {
return [
'userId' => $this->userId,
'data' => $this->data
];
}
public function __unserialize(array $data): void {
$this->userId = $data['userId'];
$this->data = $data['data'];
$this->createdAt = time();
}
public function getCreatedAt(): int {
return $this->createdAt;
}
}
$session = new Session("user123", ["theme" => "dark"], time());
$serialized = serialize($session);
$restored = unserialize($serialized);
echo "Created at: " . $restored->getCreatedAt();
Zwróć uwagę, że createdAt jest wykluczane z serializacji i otrzymuje nowy znacznik czasu podczas deserializacji. Jest to przydatne do wykluczania danych wrażliwych, wartości tymczasowych lub zasobów, których nie można serializować, takich jak połączenia z bazą danych.
Te metody zastąpiły starsze metody __sleep() i __wakeup() w PHP 7.4, oferując bardziej przejrzyste podejście, w którym pracujesz bezpośrednio z tablicami danych zamiast z nazwami właściwości.
Wyzwanie
ŁatwyStwórzmy system buforowania profilu użytkownika, który pokazuje, jak __serialize() i __unserialize() pozwalają kontrolować, jakie dane są zapisywane i jak są przywracane.
Rozmieścisz swój kod w dwóch plikach:
UserProfile.php: Utwórz klasęUserProfile, która reprezentuje profil użytkownika z funkcjami buforowania. Użyj promocji konstruktora, aby zdefiniować prywatne właściwości dla$userId(string),$username(string),$email(string) i$accessToken(string). Dodaj prywatną właściwość$cachedAt, która przechowuje informację, kiedy profil został zapisany w pamięci podręcznej (początkowo ustaw ją w konstruktorze na"not cached"). Twoja klasa powinna zawierać:__serialize(): Zwraca tablicę zawierającą tylkouserId,usernameiemail.accessTokenzawiera poufne dane i nigdy nie powinien być serializowany. Znacznik czasucachedAtzostanie wygenerowany ponownie podczas przywracania.__unserialize(): PrzywracauserId,usernameiemailz tablicy danych. UstawiaaccessTokenna"expired"(ponieważ tokeny nie powinny być zachowywane).getInfo(): Zwraca ciąg znaków w formacie:"[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
main.php: Dołącz plik UserProfile. Otrzymasz cztery dane wejściowe: identyfikator użytkownika, nazwę użytkownika, adres e-mail i token dostępu. Utwórz instancjęUserProfilez tymi wartościami. Wypisz trzy wiersze:- Informacje o oryginalnym profilu (przed serializacją)
- Zserializuj profil za pomocą
serialize(), a następnie zdeserializuj go za pomocąunserialize(), aby utworzyć przywrócony profil. Wypisz informacje o przywróconym profilu. - Wypisz
"Token preserved: yes"lub"Token preserved: no", zależnie od tego, czy token przywróconego profilu jest taki sam jak oryginalny (podpowiedź: nie powinien być taki sam, ponieważ tokeny wygasają podczas przywracania)
Ten wzorzec jest niezbędny do bezpiecznego buforowania danych użytkownika. Chcesz przechowywać informacje o profilu, ale nigdy nie zachowywać poufnych danych uwierzytelniających, takich jak tokeny dostępu. Gdy profil zostanie przywrócony z pamięci podręcznej, token jest oznaczany jako wygasły, co zmusza aplikację do uzyskania nowego.
Spróbuj swoich sił
<?php
require_once 'UserProfile.php';
// Wczytaj dane wejściowe
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));
// TODO: Utwórz instancję UserProfile z wartościami wejściowymi
// TODO: Wyświetl informacje o oryginalnym profilu (przed serializacją)
// TODO: Zserializuj profil, a następnie go zdeserializuj, aby utworzyć przywrócony profil
// TODO: Wyświetl informacje o przywróconym profilu
// TODO: Wyświetl "Token preserved: yes" lub "Token preserved: no"
// w zależności od tego, czy token przywróconego profilu jest taki sam jak token oryginalnego profilu
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online