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

| 2008年02月07日 02:34

オブジェクトをまるごと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(95) "O:6:"myitem":4:{s:4:"item";s:12:"醤油ラーメン";s:5:"price";i:850;s:3:"lot";i:5;s:4:"flag";b:1;}"
商品名 : 醤油ラーメン
価格 : 850円
数量 : 5個
合計金額は4250円

PHP シリアライズ/アンシリアライズタグ:

トラックバック
  • http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/208
コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)





この情報を登録しますか?

このサイトは次のライセンスで保護されています。

Creative Commons License

IT業界、エンジニア関連の求人
Web業界に精通したエージェントなので、希望に合った仕事、プロジェクト、雇用形態を紹介してくれてしっかりと転職活動をサポートしてくれます。
初心者のみ採用!【スノーグラス】WEB系エンジニア募集
初心者のみのweb系エンジニア求人!なんでだ?そろそろ転職考えてるのでここ行ってみようかな・・・
Twitter Updates