Menu
Coddy logo textTech

__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 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() 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 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'teki 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 dosya halinde düzenleyeceksiniz:

  • UserProfile.php — Önbelleğe alma yeteneklerine 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 constructor promotion kullanın. Profilin ne zaman önbelleğe alındığını saklayan bir private $cachedAt özelliği ekleyin (constructor içinde başlangıçta "not cached" olarak ayarlayın). Sınıfınızın şunlara ihtiyacı vardır:
    • __serialize() — Yalnızca userId, username ve email içeren bir dizi döndürür. accessToken hassastır ve asla serialize edilmemelidir. cachedAt zaman damgası geri yükleme sırasında yeniden oluşturulacaktır.
    • __unserialize() — Veri dizisinden userId, username ve email bilgilerini geri yükler. accessToken değ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 bir UserProfile örneği oluşturun. Üç satır yazdırın:
    • Orijinal profilin bilgisi (serialization işleminden önce)
    • Profili serialize() kullanarak serialize edin, ardından geri yüklenmiş bir profil oluşturmak için unserialize() kullanarak geri yükleyin. Geri yüklenen profilin bilgisini 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 getirmek istemezsiniz. Profil önbellekten geri yüklendiğinde, token süresi dolmuş olarak işaretlenir ve uygulamanın yeni bir token alması zorunlu kılınır.

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: "Token preserved: yes" veya "Token preserved: no" yazdırın
// geri yüklenen profilin token'ının orijinaliyle 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