Javaでよくシリアライズという言葉が出てきてたんですが、まったく理解できませんでした。
Serializableインターフェイスって何だよ。
PHPでのシリアライズはもう少し簡単で、インスタンスを丸ごとそのまま保存という意味です。
a.phpでnewしたオブジェクトをシリアライズして保存し、b.phpでそれを読み込むと元のインスタンスが復活できます。
具体的にどのようなことができるかというと以下のような感じです。
Serial.class.php
1
2
3
4
5
6
7
8
9
10
11
12
|
//適当なクラス
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
|
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
|
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
トラックバック
トラックバックURL: