Menu
CoddyTech

__serialize & __unserialize

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 49 dari 91.

Saat kamu perlu mengonversi object menjadi string untuk disimpan atau dikirim, PHP menggunakan serialisasi. Magic method __serialize() dan __unserialize() memberimu kendali atas data yang disimpan dan cara memulihkannya.

method __serialize() mengembalikan array data yang akan diserialisasi, sedangkan __unserialize() menerima array tersebut dan membangun kembali object:

<?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();

Perhatikan bahwa createdAt tidak disertakan dalam serialisasi dan mendapat stempel waktu baru saat diserialisasi kembali. Ini berguna untuk mengecualikan data sensitif, nilai sementara, atau sumber daya yang tidak dapat diserialisasi, seperti koneksi database.

Method ini menggantikan method __sleep() dan __wakeup() yang lebih lama di PHP 7.4, dengan menawarkan pendekatan yang lebih sederhana, yaitu kamu bekerja langsung dengan array data alih-alih nama property.

challenge icon

Tantangan

Mudah

Mari buat sistem caching profil pengguna yang menunjukkan bagaimana __serialize() dan __unserialize() memberimu kendali atas data yang disimpan dan cara memulihkannya.

Kamu akan mengatur kodemu dalam dua file:

  • UserProfile.php: Buat class UserProfile yang mewakili profil pengguna dengan kemampuan caching. Gunakan promosi konstruktor untuk mendefinisikan property privat untuk $userId (string), $username (string), $email (string), dan $accessToken (string). Tambahkan property privat $cachedAt yang menyimpan waktu profil dicache (awalnya atur ke "not cached" di konstruktor). Class-mu memerlukan:
    • __serialize(): Mengembalikan array yang hanya berisi userId, username, dan email. accessToken bersifat sensitif dan tidak boleh diserialisasi. Stempel waktu cachedAt akan dibuat ulang saat pemulihan.
    • __unserialize(): Memulihkan userId, username, dan email dari array data. Mengatur accessToken ke "expired" (karena token tidak boleh dipertahankan).
    • getInfo(): Mengembalikan string dengan format: "[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
  • main.php: Sertakan file UserProfile. Kamu akan menerima empat input: ID pengguna, username, email, dan access token. Buat instance UserProfile dengan nilai-nilai ini. Cetak tiga baris:
    • Info profil asli (sebelum serialisasi)
    • Serialisasikan profil menggunakan serialize(), lalu lakukan unserialisasi menggunakan unserialize() untuk membuat profil yang dipulihkan. Cetak info profil yang dipulihkan.
    • Cetak "Token preserved: yes" atau "Token preserved: no" bergantung pada apakah token profil yang dipulihkan cocok dengan token asli (petunjuk: token seharusnya tidak cocok karena token kedaluwarsa saat dipulihkan)

Pola ini penting untuk melakukan caching data pengguna dengan aman. Kamu ingin menyimpan informasi profil, tetapi tidak pernah menyimpan kredensial sensitif seperti access token. Saat profil dipulihkan dari cache, token ditandai sebagai kedaluwarsa sehingga aplikasi harus mendapatkan token baru.

Coba sendiri

<?php

require_once 'UserProfile.php';

// Baca input
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));

// TODO: Buat instance UserProfile dengan nilai input

// TODO: Cetak info profil asli (sebelum serialisasi)

// TODO: Serialisasikan profil, lalu lakukan deserialisasi untuk membuat profil yang dipulihkan

// TODO: Cetak info profil yang dipulihkan

// TODO: Cetak "Token preserved: yes" atau "Token preserved: no"
// bergantung pada apakah token profil yang dipulihkan sama dengan token profil asli

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online