__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.
Tantangan
MudahMari 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 classUserProfileyang 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$cachedAtyang menyimpan waktu profil dicache (awalnya atur ke"not cached"di konstruktor). Class-mu memerlukan:__serialize(): Mengembalikan array yang hanya berisiuserId,username, danemail.accessTokenbersifat sensitif dan tidak boleh diserialisasi. Stempel waktucachedAtakan dibuat ulang saat pemulihan.__unserialize(): MemulihkanuserId,username, danemaildari array data. MengaturaccessTokenke"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 instanceUserProfiledengan nilai-nilai ini. Cetak tiga baris:- Info profil asli (sebelum serialisasi)
- Serialisasikan profil menggunakan
serialize(), lalu lakukan unserialisasi 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: 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
?>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