__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.
Tantangan
MudahMari 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 classUserProfileyang 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$cachedAtyang menyimpan waktu profil di-cache (awalnya atur ke"not cached"di constructor). Class-mu memerlukan:__serialize(): Mengembalikan array yang hanya berisiuserId,username, danemail.accessTokenbersifat sensitif dan tidak boleh diserialisasi. Stempel waktucachedAtakan dibuat ulang saat dipulihkan.__unserialize(): MemulihkanuserId,username, danemaildari array data. MengaturaccessTokenke"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 instanceUserProfiledengan nilai-nilai ini. Cetak tiga baris:- Info profil asli (sebelum serialisasi)
- Serialisasikan profil menggunakan
serialize(), lalu batalkan serialisasinya menggunakanunserialize()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
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online