PHPKonf Istanbul PHP Conference 2019 - Call for Papers

Nesne Dizgeleştirme

Oturumlardaki nesnelerin dizgeleştirilmesi

serialize() işlevi PHP'de saklanmış bir değerin bayt-akımı gösterimini içeren bir dizge döndürür. Özgün değişken değerlerini yeniden oluşturmak için unserialize() işlevi kullanılabilir. Bir nesneyi saklamak için dizgeleştirme kullanımı nesnenin içindeki tüm değişkenleri saklar. Nesnenin yöntemleri saklanmaz sadece sınıf ismi saklanır.

Bir nesne için unserialize() kullanabilmek için sınıf nesnesinin tanımlı olması gerekir. Yani, A sınıfının bir nesnesi varsa ve siz onu dizgeleştiriseniz, A sınıfının ismini ve içerdiği tüm değişkenlerin değerlerini içeren bir dizge alırsınız. Başka bir dosyada bu dizgeyi unserialize() ile dönüştürmek isterseniz, bu dosyada daha önce A sınıfını tanımlamış ve nesnesini oluşturmuş olmalısınız. Bu, örneğin, A sınıfının tanımını bir include dosyasında saklayıp bu dosyayı betiğinize dahil ederek veya spl_autoload_register() işlevini kullanarak yapabilirsiniz.

<?php
// classa.inc:
  
  
class {
      public 
$one 1;
    
      public function 
show_one() {
          echo 
$this->one;
      }
  }
  
// page1.php:

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// $s'i page2.php'nin bulabileceği bir yere sakla
  
file_put_contents('store'$s);

// page2.php:
  
  // unserialize işlevinin düzgün çalışması için gerekli
  
include("classa.inc");

  
$s file_get_contents('store');
  
$a unserialize($s);

  
// şimdi show_one() işlevini kullanabiliriz.  
  
$a->show_one();
?>

Bir uygulama oturumları kullanıyorsa ve nesneleri kaydetmek için session_register() işlevini kullanırsa, bu nesneler her PHP sayfasının sonunda otomatik olarak dizgeleştirilir ve sonraki sayfaların her birinde özdevinimli olarak nesneleştirilir. Yani, bu nesneler, oturumun bir parçası haline geldiklerinde, uygulama sayfalarının herhangi birinde görünebilir. Bununla birlikte, session_register() işlevi PHP 5.4.0'da kaldırıldı.

Bir uygulama, uygulamada daha sonra kullanmak için nesneleri dizgeleştiriyorsa, uygulamanın o nesnenin sınıf tanımını uygulama boyunca içermesi şiddetle tavsiye edilir. Bunu yapmamak, bir nesnenin sınıf tanımlaması olmaksızın nesneleştirilmesiyle sonuçlanabilir, bu da PHP'nin nesneyi hiçbir yöntemi olmayan bir __PHP_Incomplete_Class_Name sınıfına sokmasına neden olur ve sonuçta nesne işe yaramaz hale gelir.

Yani, yukarıdaki örnekte, eğer session_register("a") çalıştırarak $a bir oturumun parçası haline gelirse, classa.inc dosyasını yalnız page1.php ve page2.php dosyalarına değil tüm sayfa dosyalarına dahil etmelisiniz.

Yukarıdaki tavsiyenin ötesinde, __sleep() ve __wakeup() yöntemlerini kullanarak da bir nesne üzerinde dizgeleştirme ve yeniden nesneleştirme yapabileceğinizi unutmayın. __sleep() kullanımı ayrıca, nesne özelliklerinin tamamının değil sadece bir kısmının dizgeleştirilmesini de sağlar.

add a note add a note

User Contributed Notes 2 notes

up
176
php at lanar dot com dot au
9 years ago
Note that static members of an object are not serialized.
up
17
michael at smith-li dot com
3 years ago
Reading this page you'd be left with the impression that a class's `serialize` and `unserialize` methods are unrelated to the `serialize` and `unserialize` core functions; that only `__sleep` and `__unsleep` allow you to customize an object's serialization interface. But look at http://php.net/manual/en/class.serializable.php and you'll see that there is a more straightforward way to control how a user-defined object is serialized and unserialized.
To Top