Menu
Coddy logo textTech

__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.

challenge icon

Wyzwanie

Łatwy

Stwó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ą tylko userId, username i email. accessToken zawiera poufne dane i nigdy nie powinien być serializowany. Znacznik czasu cachedAt zostanie wygenerowany ponownie podczas przywracania.
    • __unserialize(): Przywraca userId, username i email z tablicy danych. Ustawia accessToken na "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ę UserProfile z 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

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online