__serialize & __unserialize
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 49 / 91.
Bir nesneyi depolama veya iletim için bir dizeye dönüştürmeniz gerektiğinde, PHP serileştirme (serialization) kullanır. __serialize() ve __unserialize() sihirli yöntemleri, tam olarak hangi verilerin kaydedileceği ve nasıl geri yükleneceği üzerinde size kontrol sağlar.
__serialize() metodu, serileştirilecek verilerden oluşan bir dizi döndürürken, __unserialize() bu diziyi alır ve nesneyi yeniden oluşturur:
<?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 "User: " . $restored->getCreatedAt();
createdAt değişkeninin serileştirme dışında tutulduğuna ve serileştirme geri alındığında yeni bir zaman damgası aldığına dikkat edin. Bu, hassas verileri, geçici değerleri veya veritabanı bağlantıları gibi serileştirilemeyen kaynakları hariç tutmak için kullanışlıdır.
Bu yöntemler, PHP 7.4'te eski __sleep() ve __wakeup() yöntemlerinin yerini alarak, özellik adları yerine doğrudan veri dizileriyle çalıştığınız daha temiz bir yaklaşım sunar.
Görev
Kolay__serialize() ve __unserialize() metotlarının hangi verilerin kaydedileceği ve nasıl geri yükleneceği üzerinde size nasıl kontrol sağladığını gösteren bir kullanıcı profili önbelleğe alma sistemi oluşturalım.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
UserProfile.php— Önbelleğe alma yeteneklerine sahip bir kullanıcı profilini temsil eden birUserProfilesınıfı oluşturun.$userId(string),$username(string),$email(string) ve$accessToken(string) için private özellikleri tanımlamak üzere constructor promotion kullanın. Profilin ne zaman önbelleğe alındığını saklayan private bir$cachedAtözelliği ekleyin (başlangıçta yapıcıda"not cached"olarak ayarlayın). Sınıfınızın şunlara ihtiyacı vardır:__serialize()— YalnızcauserId,usernameveemailiçeren bir dizi döndürür.accessTokenhassastır ve asla serialize edilmemelidir.cachedAtzaman damgası geri yükleme sırasında yeniden oluşturulacaktır.__unserialize()— Veri dizisindenuserId,usernameveemailbilgilerini geri yükler.accessTokendeğerini"expired"olarak ayarlar (çünkü token'lar kalıcı olmamalıdır).getInfo()— Şu formatta bir string döndürür:"[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
main.php— UserProfile dosyasını dahil edin. Dört girdi alacaksınız: bir kullanıcı ID'si, bir kullanıcı adı, bir e-posta ve bir erişim token'ı. Bu değerlerle birUserProfileörneği oluşturun. Üç satır yazdırın:- Orijinal profilin bilgileri (serialization öncesi)
- Profili
serialize()kullanarak serialize edin, ardından geri yüklenen bir profil oluşturmak içinunserialize()kullanarak geri yükleyin. Geri yüklenen profilin bilgilerini yazdırın. - Geri yüklenen profilin token'ının orijinaliyle eşleşip eşleşmediğine bağlı olarak
"Token preserved: yes"veya"Token preserved: no"yazdırın (ipucu: token'lar geri yükleme sırasında sona erdiği için eşleşmemelidir)
Bu desen, kullanıcı verilerini güvenli bir şekilde önbelleğe almak için gereklidir — profil bilgilerini saklamak istersiniz ancak erişim token'ları gibi hassas kimlik bilgilerini asla kalıcı hale getirmemelisiniz. Profil önbellekten geri yüklendiğinde, token süresi dolmuş olarak işaretlenir ve uygulamayı yeni bir tane almaya zorlar.
Kopya kağıdı
__serialize() ve __unserialize() sihirli metotları, serileştirme sırasında hangi verilerin kaydedileceğini ve nesnelerin nasıl geri yükleneceğini kontrol eder.
__serialize(), serileştirilecek verilerden oluşan bir dizi döndürür:
<?php
public function __serialize(): array {
return [
'userId' => $this->userId,
'data' => $this->data
];
}__unserialize() diziyi alır ve nesneyi yeniden oluşturur:
<?php
public function __unserialize(array $data): void {
$this->userId = $data['userId'];
$this->data = $data['data'];
$this->createdAt = time();
}Bir nesneyi dizeye dönüştürmek için serialize() ve onu geri yüklemek için unserialize() kullanın:
<?php
$serialized = serialize($session);
$restored = unserialize($serialized);Bu metotlar; hassas verileri, geçici değerleri veya serileştirilemeyen kaynakları (veritabanı bağlantıları gibi) hariç tutmak için kullanışlıdır. Özellikler, geri yükleme sırasında taze değerlerle yeniden oluşturulabilir.
Kendin dene
<?php
require_once 'UserProfile.php';
// Girdileri oku
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));
// TODO: Giriş değerleriyle bir UserProfile örneği oluşturun
// TODO: Orijinal profilin bilgilerini yazdırın (serileştirmeden önce)
// TODO: Profili serileştirin, ardından geri yüklenen bir profil oluşturmak için serileştirmeyi geri alın
// TODO: Geri yüklenen profilin bilgilerini yazdırın
// TODO: Geri yüklenen profilin belirtecinin orijinaliyle eşleşip eşleşmediğine bağlı olarak
// "Token preserved: yes" veya "Token preserved: no" yazdırın
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi