PHP Unconference Europe 2015

オブジェクトのシリアル化 - セッションでのオブジェクト

serialize() は、PHPで保存可能な全ての値のバイト ストリーム表現を有する文字列を返します。 unserialize() は、この文字列を使用して元の変数 値を再生することが可能です。オブジェクトを保存するためにシリアル化 を行うと、オブジェクトの全ての変数が保存されます。オブジェクトの関 数は保存されません。クラス名だけが保存されます。

オブジェクトの unserialize() を可能とするために、 そのオブジェクトのクラスが定義される必要があります。つまり、クラス Aのオブジェクト$apage1.php で定義し、 これをシリアル化した場合、 クラスAを指す文字列が得られ、そこには、$aに含まれる変数の全ての値 が含まれます。page2.php でこの文字列を非シリアル化したい場合、クラ スAの$aを再生します。クラスAの定義が、page2.php に 現れます。これは、 例えば、クラスAのクラス定義をインクルードファイルの中に保存し、 page1.php および page2.php の中で共にこのファイルを読み込むことに より実行可能です。

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

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// page2.phpが見付られる場所に$sを保存
  
$fp fopen("store""w");
  
fwrite($fp$s);
  
fclose($fp);

// page2.php:
  
  // これは非シリアル化が正しく動作するために必要
  
include("classa.inc");

  
$s implode("", @file("store"));
  
$a unserialize($s);

  
// オブジェクト$aの関数show_one()を使用する
  
$a->show_one();
?>

セッションを使用している場合に、オブジェクトを登録するために session_register()を使用すると、これらのオブジェ クトは各PHPページの最後で自動的にシリアル化され、次のページで自動 的に非シリアル化されます。これは、基本的に、これらのオブジェクトが 一旦セッション変数となると、全てのページに現れることを意味します。

全てのページでこれらのクラスを実際には使用しない場合でも、 全てのページでこのような登録された全てのオブジェクトのクラス定義を読み込むことを強く推奨します。 これを行わずに、クラス定義が存在しない状態でオブジェクトが非シリアル化された場合、 クラスの相関が失われてすべての関数が利用できなくなるため、 __PHP_Incomplete_Class_Name クラスのオブジェクトは利用価値がかなり低くなります。

このため、上の例で、session_register("a")を実行 することにより $a がセッションの一部となった場合、page1.php および page2.php だけでなく、全てのページでファイル classa.inc を読み込むべきです。

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top