Menu
Coddy logo textTech

__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.

challenge icon

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 bir UserProfile sı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ızca userId, username ve email içeren bir dizi döndürür. accessToken hassas bir bilgidir ve hiçbir zaman serileştirilmemelidir. cachedAt zaman damgası geri yükleme sırasında yeniden oluşturulacaktır.
    • __unserialize(): userId, username ve email değerlerini veri dizisinden geri yükler. accessToken değ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 bir UserProfile ö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çin unserialize() 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

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi