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

challenge icon

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 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 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ı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 bilgileri (serialization öncesi)
    • Profili serialize() kullanarak serialize edin, ardından geri yüklenen bir profil oluşturmak için unserialize() 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

?>
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