忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/23 06:35 |
PHP1-71:シリアライズ

Javaでよくシリアライズという言葉が出てきてたんですが、まったく理解できませんでした。
Serializableインターフェイスって何だよ。

PHPでのシリアライズはもう少し簡単で、インスタンスを丸ごとそのまま保存という意味です。
a.phpでnewしたオブジェクトをシリアライズして保存し、b.phpでそれを読み込むと元のインスタンスが復活できます。

具体的にどのようなことができるかというと以下のような感じです。

Serial.class.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    
    //適当なクラス
    class Serial{
        public $param='';
        public function setParam($param){
            $this->param=$param;
        }
        public function getParam(){
            return $this->param;
        }
    }


a.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    
    require_once('Serial.class.php');
    $serial=new Serial();
    
    //適当に値を入力
    $serial->setParam('あいうえお');
    
    //シリアライズ
    $tmp_serial=serialize($serial);
    
    //保存
    file_put_contents('serial.txt',$tmp_serial);

b.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    
    require_once('Serial.class.php');
    
    //読込
    $tmp_serial=file_get_contents('serial.txt');
    
    //アンシリアライズ
    $serial=unserialize($tmp_serial);
    
    //a.phpで代入した'あいうえお'が出てくる
    var_dump($serial->getParam());

a.phpとb.phpにはセッション的関係すら存在しませんが、a.phpにアクセスした後でb.phpにアクセスすると、a.phpでの変更内容がb.phpに反映されています。

仕組み的には、serializeした時点でそのオブジェクトが単なる文字列に変換されます。
その文字列をunserializeするとオブジェクトになります。

保存されたテキストを覗いてみると、
O:6:"Serial":1:{s:5:"param";s:15:"あいうえお";}
というテキストになっています。
Serialというクラスのオブジェクトで、インスタンス変数がひとつあって中身が'あいうえお'という文字列だ、という内容です。

serializeで保存されるのはインスタンス変数だけで、メソッドやクラス変数等は保存されません。
また、serializeしたものをそのままunserializeするとインスタンス変数だけが入った__PHP_Incomplete_Classというオブジェクトになります。

しかしb.phpのように、先に該当のクラスを読み込んでおくと、unserializeした時に自動的にそのクラスと組み合わされ、完全に元通りになります。
b.phpでunserializeした$serialは、a.phpでserializeしたものと全く同一の内容になるということです。

オブジェクトを流用できるので便利と言えば便利なのですが、そこまでしてひとつのオブジェクトを使い回すということ自体がそんなにないような気が。
大体のことならセッションやDBに突っ込んでおけば事足りますし。

 

PR


2009/04/27 18:10 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-72:シリアライズ続き | HOME | 中国がソースコード開示強行>>
忍者ブログ[PR]