Web Geliştirici  :: PHP, Kohana, JavaScript, Ajax, XHTML, XML, CSS, MySQL ve diğer web yazılım geliştirme teknolojileri hakkında faydalı bilgi ve teknikler
 

PHP’de Nesne Yönelimli Programlama-13

Nesnelerin Serialize ve Unserialize İşlemleri

Bilindiği gibi serialize işlemi, nesne ve diziler gibi farklı türdeki veri yapılarının taşınabilir biçimlerini elde etmemize yarıyor. Bu sayede bu tipteki değişkenleri, daha sonra tekrar kullanabilmek için veri tabanı gibi farklı ortamlarda saklayabilir ya da sayfalar arasında parametre olarak taşıyabiliriz.

Serialize işlemine tabi tutulmuş bir değişkeni tekrar elde edebilmek için, bu sefer unserialize işlemine tabi tutarız.

Nesneler serialize edilirken nesnenin sadece özellikleri (sabit dışındaki özellikler) serialize edilir, nesnenin yöntemleri serialize işlemine katılmaz. Peki bir nesnenin yöntemlerini serialize/unserialize işlemlerinin ardından tekrar elde etmemiz mümkün değil midir? Bu sorunun cevabını aşağıda inceleyelim.

class sinif {
 
    public $ozellik1;
    public $ozellik2;
    const SABIT = 20;
 
    public function yontem()
    {
        echo 'Merhaba';
    }
 
}
 
// Yukarıdaki sınıftan bir nesne türetelim
$nesne = new sinif;
 
// Nesne özelliklerine değer atayalım
$nesne->ozellik1 = 5;
$nesne->ozellik2 = 10;
 
// Oluşturduğumuz nesneyi serialize edelim
$nesnenin_serialize_hali = serialize($nesne);
/*
Bu işlem sonucunda değişkenin değeri aşağıdaki gibi olur
$nesnenin_serialize_hali = 'O:5:"sinif":2:{s:8:"ozellik1";i:5;s:8:"ozellik2";i:10;}'
*/

Şimdi başka bir PHP dosyası açıp elimizdeki serialize edilmiş metni kullanarak nesneyi tekrar oluşturalım.

// Değişkene nesnenin serialize edilmiş halini atayalım
$nesnenin_serialize_hali = 'O:5:"sinif":2:{s:8:"ozellik1";i:5;s:8:"ozellik2";i:10;}';
 
// Unserialize işlemi ile nesneyi tekrar elde edelim
$nesne = unserialize($nesnenin_serialize_hali);
 
// Nesne içeriğini ekranda gösterelim
echo '<pre>'.print_r($nesne, TRUE).'</pre>';
/*
Çıktı:
 
__PHP_Incomplete_Class Object
(
    [__PHP_Incomplete_Class_Name] => sinif
    [ozellik1] => 5
    [ozellik2] => 10
)
// Görüldüğü gibi nesnede en başta bulunan SABIT ve yontem() üyeleri artık bulunmuyor 
*/
 
echo $nesne->ozellik1; // Çıktı: 5
 
$nesne->yontem(); // HATA; nesnede şu anda böyle bir yöntem bulunmuyor

Görüldüğü gibi “__PHP_Incomplete_Class” adlı bir sınıfdan bir nesne elde etmiş olduk. Bu sınıf PHP’nin öntanımlı bir sınıfıdır. Oluşturulan nesnenin sınıf tanımı o anda bulunamadı ise kullanılır. Sayfamızda şu anda “sinif” isimli bir sınıf tanımı mevcut olmadığı için bu öntanımlı sınıftan bir nesne elde etmiş olduk.

Görüldüğü gibi elde edilen nesnenin özelliklerinden birisi, nesnenin ilk türetilmiş olduğu sınıfın adını (“sinif“) tutuyor. Ayrıca nesnenin başlangıçta sahip olduğu “SABIT” isimli sabiti ve “yontem()” adlı yöntemi tekrar elde edemedik.

Şimdi de nesnenin ilk türetildiği sınıfın tanımını sayfamıza ekleyip ondan sonra unserialize yapıp nesnemizi tekrar elde edelim ve arada farka bakalım.

// Önce sınıf tanımını sayfaya ekleyelim
class sinif {
 
    public $ozellik1;
    public $ozellik2;
    const SABIT = 20;
 
    public function yontem()
    {
        echo 'Merhaba';
    }
 
}
 
// Değişkene nesnenin serialize edilmiş halini atayalım
$nesnenin_serialize_hali = 'O:5:"sinif":2:{s:8:"ozellik1";i:5;s:8:"ozellik2";i:10;}';
 
// Unserialize işlemi ile nesneyi tekrar elde edelim
$nesne = unserialize($nesnenin_serialize_hali);
 
// Nesne içeriğini ekranda gösterelim
echo '<pre>'.print_r($nesne, TRUE).'</pre>';
/*
Çıktı:
 
sinif Object
(
    [ozellik1] => 5
    [ozellik2] => 10
)
*/
 
echo $nesne->ozellik1; // Çıktı: 5
 
echo sinif::SABIT; // Çıktı: 20
 
$nesne->yontem(); // Çıktı: Merhaba

Görüldüğü gibi bu sefer olması gerektiği gibi “sinif” sınıfından bir nesne elde ettik ve nesnenin sabit ve yöntemi tekrar kullanılabilir oldu.

Son olarak eğer __autoload() fonksiyonu ile sınıflarımızı otomatik olarak yükletiyorsak, unserialize() işlemini yaptığımız yere sınıf tanımını yazmamıza gerek kalmayacaktı. Şimdi bununla ilgili bir örnek yapalım. Ayrıca bu örnekte nesneyi serialize işlemine tuttuğumuzda otomatik olarak çalışan __sleep() sihirli yöntemini ve unserialize() ile nesneyi yeniden oluştururken otomatik olarak çalışan __wakeup() sihirli yöntemini de kullanalım.

Öncelikle sınıfımızı __autoload() ile otomatik olarak yükletebilmek için sınıf tanımımızı “sinif.php” adında harici bir dosyaya taşıyalım.

Harici dosya: sinif.php

class sinif {
 
    public $ozellik1;
    public $ozellik2;
    const SABIT = 20;
 
    public function yontem()
    {
        echo 'Merhaba<br/>';
    }
 
    // Bu sihirli yöntem, nesne serialize işlemine tabi tutulduğunda devreye girer
    public function __sleep()
    {
        echo 'Serialize işlemi gerçekleşti<br/>';
 
        // Serialize işlemine dahil edilmesi gereken özellik isimlerini dizi olarak döndürmemiz gerek
        return array('ozellik1', 'ozellik2');
    }
 
    // Bu sihirli yöntem, unserialize işlemi sonucu nesne tekrar elde edildiğinde devreye girer
    public function __wakeup()
    {
        echo 'Unserialize işlemi gerçekleşti<br/>';
    }
 
}

Şimdi yeni bir PHP dosyasında aşağıdaki işlemleri yapalım.

function __autoload($sinif)
{
    include $sinif.'.php'; // "sinif.php" dosyası otomatik dahil edilecek
}
 
$nesne = new sinif;
 
$nesne->ozellik1 = 5;
$nesne->ozellik2 = 10;
 
$x = serialize($nesne);
/*
__sleep() sihirli yöntemi devreye girer
$x = 'O:5:"sinif":2:{s:8:"ozellik1";i:5;s:8:"ozellik2";i:10;}' olarak atanır
 
Çıktı: Serialize işlemi gerçekleşti
*/
 
$nesne = unserialize($x);
/*
__wakeup() sihirli yöntemi devreye girer
 
Çıktı: Unserialize işlemi gerçekleşti
*/
 
echo '<pre>'.print_r($nesne, TRUE).'</pre>';
/*
Çıktı:
 
sinif Object
(
    [ozellik1] => 5
    [ozellik2] => 10
)
*/
 
echo $nesne->ozellik1.'<br/>'; // Çıktı: 5
 
$nesne->yontem(); // Çıktı: Merhaba
 
echo sinif::SABIT; // Çıktı: 20

Yorum Yapın