HOME>WEBプログラム覚書>PHP シリアライズ/アンシリアライズ

PHP シリアライズ/アンシリアライズ

オブジェクトをまるごとDBやテキストに書き込める形式にしてくれるシリアライズ。オブジェクトが保持しているすべての変数が対象。

メソッドは保存されないがクラス名が保存されるのでアンシリアライズ時に紐付けされる??

詳しくはわからないがとりあえずシリアル化するクラスをアンシリアライズするページに読み込んでおけばメソッドの利用も可能になる。

サンプル


 /**
  * シリアル化するオブジェクトのクラス
  * = アンシリアライズに必要なクラス
  */
  class MyItem
  {
     var $item;
     var $price;
     var $lot;
     var $flag;

     function MyItem($item, $price, $lot)
     {
         $this->item = $item;
         $this->price = $price;

         if (Validator::lotCheker($lot)) {
             $this->lot = $lot;
             $this->flag = true;
         } else {
             $this->flag = false;
         }
     }

     function getItemName()
     {
         return $this->item;
     }

     function getItemPrice()
     {
         return $this->price;
     }

     function getItemLot()
     {
         return $this->lot;
     }
  }

  // オブジェクトをシリアライズ
  class ItemSerialize
  {
      var $s_item;

      function ItemSerialize($obj)
      {
          if (is_object($obj)) {
          $this->s_item = serialize($obj);
          }
      }

      // シリアライズしたデータをどっかに書き込む
      function put()
      {
          // サブクラスで実装
      }
  }

  // 表示用 詳細はサブクラスで実装
  class View
  {
      var $obj;

      // アンシリアライズ
      function View($s_item)
      {
          $this->obj = unserialize($s_item);
      }

      // 表示
      function viewItem()
      {
          /* サブクラスで実装 */
          $this->viewItemName();
          $this->viewItemPrice();
          $this->viewItemLot();

          echo '合計金額は' . $this->total() . '円';
      }

      // 合計金額 = 料金 * 個数
      function total()
      {
          $total = $this->obj->price * $this->obj->lot;
          return $total;
      }
  }

  class ViewEcho extends View
  {
      function viewEcho($s_item)
      {
          parent::View($s_item);
      }

      function viewItemName()
      {
          echo '商品名 : ' . $this->obj->getItemName() . '<br />';
      }

      function viewItemPrice()
      {
          echo '価格 : ' . $this->obj->getItemPrice() . '円<br />';
      }

      function viewItemLot()
      {
          echo '数量 : ' . $this->obj->getItemLot() . '個<br />';
      }
  }

  // バリデート
  class Validator
  {
      function lotCheker($lot)
      {
          if (is_numeric($lot)) {
              if (0 < $lot && $lot < 100) {
                  return true;
              }
              return false;
          }
          return false;
      }
  }

  // サニタイズ用
  class Sanitize
  {
  // 略
  }

  /**
   * ここからクライアントのコード
   */
  $item = new MyItem('醤油ラーメン', 850, 5);
  if ($item->flag) {
      // シリアライズ
      $s = new ItemSerialize($item);
      var_dump($s->s_item); // どんな感じか確認

      echo '<hr />';

      // 元に戻せれば成功
      $view = new viewEcho($s->s_item);
      $view->viewItem();
  }

実行結果

string(101) "O:6:"MyItem":4:{s:4:"item";s:18:"醤油ラーメン";s:5:"price";i:850;s:3:"lot";i:5;s:4:"flag";b:1;}"
商品名 : 醤油ラーメン
価格 : 850円
数量 : 5個
合計金額は4250円
投稿日 2008年2月 7日 02:34
カテゴリ PHP
タグ テストコード | 動作確認
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1142

コメント

コメントする
Name
Email Address
URL