__serialize ve __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 aktarım için bir dizeye dönüştürmeniz gerektiğinde PHP serileştirme kullanır. __serialize() ve __unserialize() sihirli metotları, tam olarak hangi verilerin kaydedileceği ve nasıl geri yükleneceği üzerinde kontrol sahibi olmanızı sağlar.
__serialize() yöntemi serileştirilecek bir veri dizisi 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 "Created at: " . $restored->getCreatedAt();
createdAt öğesinin serileştirmeye dahil edilmediğine ve serileştirme kaldırıldığı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() yöntemlerinin 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 dosyaya ayıracaksınız:
UserProfile.php: Önbelleğe alma özelliklerine 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 kurucu destekli özellik tanımlamayı kullanın. Profilin önbelleğe alındığı zamanı saklayan private bir$cachedAtözelliği ekleyin (kurucuda başlangıçta"not cached"olarak ayarlayın). Sınıfınız şunlara sahip olmalıdır:__serialize(): YalnızcauserId,usernameveemailiçeren bir dizi döndürür.accessTokenhassas bir bilgidir ve hiçbir zaman serileştirilmemelidir.cachedAtzaman damgası geri yükleme sırasında yeniden oluşturulacaktır.__unserialize():userId,usernameveemaildeğerlerini veri dizisinden geri yükler.accessTokendeğerini"expired"olarak ayarlar (çünkü belirteçler kalıcı olmamalıdır).getInfo(): Şu biçimde bir dize 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ı kimliği, bir kullanıcı adı, bir e-posta ve bir erişim belirteci. Bu değerlerle birUserProfileörneği oluşturun. Üç satır yazdırın:- Serileştirmeden önce özgün profilin bilgileri
- Profili
serialize()kullanarak serileştirin, ardından geri yüklenmiş bir profil oluşturmak içinunserialize()kullanarak serileştirmeyi kaldırın. Geri yüklenmiş profilin bilgilerini yazdırın. - Geri yüklenmiş profilin belirteci özgün belirteçle eşleşiyorsa
"Token preserved: yes", eşleşmiyorsa"Token preserved: no"yazdırın (ipucu: geri yükleme sırasında belirteçlerin süresi dolduğundan eşleşmemelidir)
Bu kalıp, kullanıcı verilerini güvenli bir şekilde önbelleğe almak için gereklidir. Profil bilgilerini saklamak, ancak erişim belirteçleri gibi hassas kimlik bilgilerini hiçbir zaman kalıcı olarak depolamamak istersiniz. Profil önbellekten geri yüklendiğinde belirteç süresi dolmuş olarak işaretlenir ve bu da uygulamayı yeni bir belirteç almaya zorlar.
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: Girdi değerleriyle bir UserProfile örneği oluştur
// TODO: Orijinal profilin bilgilerini yazdır (serileştirmeden önce)
// TODO: Profili serileştir, ardından geri yüklenmiş bir profil oluşturmak için unserialize et
// TODO: Geri yüklenmiş profilin bilgilerini yazdır
// TODO: Print "Token preserved: yes" or "Token preserved: no"
// geri yüklenmiş profilin token'ının orijinal ile eşleşip eşleşmediğine bağlı olarak
?>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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi