E. SERIALIZATION

Tujuan Pembelajaran

Setelah menyelesaikan materi ini, mahasiswa diharapkan mampu:

  1. Memahami konsep serialization dan deserialization dalam PHP.
  2. Menggunakan fungsi serialize() dan unserialize() untuk menyimpan dan memulihkan object.
  3. Menjelaskan peran __sleep() dan __wakeup() dalam proses serialization.
  4. Menerapkan serialization dalam pengelolaan data pada program PHP berbasis objek.
KONSEP DASAR SERIALIZE

Konsep Dasar: Serialisasi adalah proses mengubah suatu object menjadi format bytestream yang dapat disimpan dalam file atau ditransfer melalui jaringan. Hal ini berguna untuk menyimpan data secara persisten, seperti dalam sesi PHP.

Di PHP, serialisasi dan deserialisasi dilakukan dengan menggunakan dua fungsi utama:

  • serialize(\$object): Mengubah object menjadi format string.
  • unserialize(\$string): Mengembalikan object dari string yang telah diserialisasi.
\$encoded = serialize(\$object);
\$decoded = unserialize(\$encoded);

Untuk menambah pemahamanmu, coba perhatikan ilustrasi inheritance berikut ini!.

Gambar 7 Proses Serialize dan Unserialize pada Object

Gambar 7 Proses Serialize dan Unserialize pada Object

Pada proses serialize, object seperti โ€œbarangโ€ dimasukkan ke dalam kotak untuk disimpan atau dikirim. Kemudian melalui unserialize, kotak dibuka kembali dan object tersebut siap digunakan.

Penggunaan Serialisasi dalam PHP

Serialisasi paling sering digunakan dalam sesi PHP, yang secara otomatis menyimpan dan memulihkan object di antara kunjungan halaman. Selain itu, serialisasi juga dapat digunakan untuk:

  • Menyimpan object dalam file atau database
  • Mengirim object melalui jaringan (API/WebSocket)
  • Menyimpan cache object untuk meningkatkan performa aplikasi

Sebelum melakukan deserialisasi dengan unserialize(), class object harus sudah didefinisikan. Jika tidak, object akan dikonversi menjadi stdClass, yang membuatnya tidak dapat digunakan dengan semestinya. Untuk menghindari masalah ini, pastikan file yang berisi definisi class selalu dimuat sebelum sesi dimulai:

include "class_definitions.php";
session_start();
Magic Method __sleep() dan __wakeup()

PHP menyediakan dua magic method yang dipanggil saat proses serialisasi dan deserialisasi terjadi. __sleep() dipanggil sebelum serialisasi, dapat digunakan untuk membersihkan data, menutup koneksi database, dan hanya menyimpan property tertentu, harus mengembalikan array berisi property yang akan disimpan. __wakeup() dipanggil setelah deserialisasi, dapat digunakan untuk menginisialisasi ulang object, seperti membuka kembali koneksi database atau file.

Berikut adalah contoh class Log, yang dapat mencatat log ke dalam file. Class ini menggunakan __sleep() untuk menutup file sebelum serialisasi dan __wakeup() untuk membukanya kembali setelah deserialisasi.

class Log {
    private \$filename;
    private \$fileHandle;

    public function __construct(\$filename) {
        \$this->filename = \$filename;
        \$this->open();
    }

    private function open() {
        \$this->fileHandle = fopen(\$this->filename, 'a') or die("Tidak dapat membuka file {\$this->filename}");
    }

    public function write(\$message) {
        fwrite(\$this->fileHandle, "{\$message}\n");
    }

    public function read() {
        return file_get_contents(\$this->filename);
    }

    public function __sleep() {
        fclose(\$this->fileHandle);
        return ['filename'];
    }

    public function __wakeup() {
        \$this->open();
    }
}

Dalam implementasi ini, ketika object diserialisasi, __sleep() akan menutup file dan hanya menyimpan property filename. Saat object di-unserialize, __wakeup() akan membuka kembali file sehingga object dapat digunakan kembali.

Membuat Object Persistent dengan Sesi PHP

Untuk menunjukkan penggunaan serialisasi dalam sesi PHP, berikut adalah implementasi yang memungkinkan object Log tetap ada di antara halaman yang berbeda.

Contoh implementasi penggunaan object Log dalam sesi PHP:

1. Halaman Utama (index.php)

Halaman ini akan membuat object log jika belum ada dalam sesi, lalu menuliskan pesan ke dalamnya.

include_once "Log.php";
session_start();

\$now = date("Y-m-d H:i:s");

if (!isset($_SESSION['logger'])) {
    $_SESSION['logger'] = new Log("log.txt");
    $_SESSION['logger']->write("Session dimulai pada \$now");
    echo "

Session dimulai dan object log dibuat.

"; } else { echo "

Object log telah ada dalam sesi.

"; } $_SESSION['logger']->write("Mengakses halaman utama pada \$now"); echo "

Isi log saat ini:

"; echo nl2br($_SESSION['logger']->read()); <.a href="#">Ke Halaman Selanjutnya

2. next.php

Halaman ini akan menggunakan kembali object log dari sesi tanpa perlu membuat ulang.

include_once "Log.php";
session_start();

\$now = date("Y-m-d H:i:s");

if (isset($_SESSION['logger'])) {
    $_SESSION['logger']->write("Mengakses halaman kedua pada \$now");

    echo "

Isi log saat ini:

"; echo nl2br($_SESSION['logger']->read()); } else { echo "

Session belum dibuat!

"; } <.a href="#">Kembali ke Halaman Utama
Output yang Dihasilkan

Jika pengguna mengakses index.php terlebih dahulu, lalu berpindah ke next.php, isi log akan terlihat seperti berikut:


Session dimulai pada 2025-02-18 14:00:00
Mengakses halaman utama pada 2025-02-18 14:00:00
Mengakses halaman kedua pada 2025-02-18 14:02:15

LATIHAN

Untuk menguji pemahaman kamu tentang penggunaan serialization dalam OOP PHP, kerjakan aktivitas berikut ini!

Lengkapilah kode berikut agar object dari class Pengaturan dapat diserialisasi dan disimpan dalam file, lalu dibaca ulang dan ditampilkan kembali. Isilah bagian yang kosong dengan fungsi atau properti yang tepat.

<?php
class Pengaturan {
    public $tema;
    public $bahasa;

    public function __construct($tema, $bahasa) {
        $this->___ = $tema;
        $this->___ = $bahasa;
    }

    public function tampilkan() {
        return "Tema: {$this->tema}, Bahasa: {$this->bahasa}";
    }
}

// Buat object baru
$setelan = new Pengaturan("Gelap", "Indonesia");

// Simpan ke file
$konten = ___($setelan);
file_put_contents("setelan.txt", $konten);

// Baca kembali dari file
$data = file_get_contents("setelan.txt");
$setelanBaru = ___($data);

// Tampilkan hasil
echo $setelanBaru->___();
?>

Seret ke bagian kosong:

  • serialize
  • bahasa
  • tema
  • tampilkan
  • unserialize