Menu
CoddyTech

__serialize & __unserialize

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

Saat kamu perlu mengubah 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 mendapatkan stempel waktu baru saat dibatalkan serialisasinya. Ini berguna untuk mengecualikan data sensitif, nilai sementara, atau sumber daya yang tidak dapat diserialisasikan, seperti koneksi database.

Metode ini menggantikan metode lama __sleep() dan __wakeup() di PHP 7.4, dengan menawarkan pendekatan yang lebih rapi, yaitu kamu bekerja langsung dengan array data, bukan nama properti.

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 menyusun kodemu dalam dua file:

  • UserProfile.php: Buat class UserProfile yang merepresentasikan profil pengguna dengan kemampuan caching. Gunakan promosi constructor untuk mendefinisikan property privat untuk $userId (string), $username (string), $email (string), dan $accessToken (string). Tambahkan property privat $cachedAt yang menyimpan waktu profil di-cache (awalnya atur ke "not cached" di constructor). 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 dipulihkan.
    • __unserialize(): Memulihkan userId, username, dan email dari array data. Mengatur accessToken ke "expired" (karena token tidak seharusnya disimpan).
    • getInfo(): Mengembalikan string dengan format: "[username] ([email]) - Token: [accessToken]"
  • main.php: Sertakan file UserProfile. Kamu akan menerima empat input: ID pengguna, nama pengguna, email, dan access token. Buat instance UserProfile dengan nilai-nilai ini. Cetak tiga baris:
    • Info profil asli (sebelum serialisasi)
    • Serialisasikan profil menggunakan serialize(), lalu batalkan serialisasinya 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: Tampilkan info profil asli (sebelum serialisasi)

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

// TODO: Tampilkan info profil yang dipulihkan

// TODO: Tampilkan "Token preserved: yes" atau "Token preserved: no"
// bergantung pada apakah token profil yang dipulihkan cocok dengan token aslinya

?>
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