Web aym.pekori.to

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

注意: PHP 3では、オブジェクトはシリアル化、非シリアル化の課程でクラスの 相関を失ってしまいました。復元される変数は、オブジェクト型ですが、 クラスもメソッドもありません。このため、全く実用的ではありません でした。(変わった構文の配列のようになっていました。)

注意

以下の情報は、PHP 4 以降でのみ有効です。

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

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

<?php
// classa.inc:
  
  
class A
  
{
      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ページの最後で自動的にシリアル化され、次のページで自動 的に非シリアル化されます。これは、基本的に、これらのオブジェクトが 一旦セッション変数となると、全てのページに現れることを意味します。

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

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