7.7.9 對(duì)象串行化(序列化)1
對(duì)象也是一種在內(nèi)存中存儲(chǔ)的數(shù)據(jù)類型济欢,他的壽命通常隨著生成該對(duì)象的程序終止而終止责鳍。有時(shí)候可能需要將對(duì)象的狀態(tài)保存下來残家,需要時(shí)再將對(duì)象恢復(fù)挡鞍。對(duì)象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己骑歹,這個(gè)過程稱對(duì)象的串行化(Serialization)。以下兩種情況需要將對(duì)象串行化:
對(duì)象需要在網(wǎng)絡(luò)中傳輸時(shí)墨微,將對(duì)象串行化成二進(jìn)制串即可道媚。
對(duì)象需要持久保存時(shí),將對(duì)象串行化后寫入文件或數(shù)據(jù)庫(kù)翘县。
串行化和反串行化函數(shù):
serialize() -- 串行化最域,返回一個(gè)包含字節(jié)流的字符串
unserialize() -- 反串行化,能夠重新把字符串變回php原來的對(duì)象值锈麸。
串行化一個(gè)對(duì)象將會(huì)保存對(duì)象的所有屬性變量和類名信息镀脂,但是不會(huì)保存對(duì)象的方法。
objstr.txt
O:6:"Person":4:{s:4:"name";s:6:"張三";s:3:"age";i:10;s:3:"sex";s:3:"男";s:4:"marr";a:5:{i:0;s:3:"aaa";i:1;s:3:"bbb";i:2;s:3:"ccc";i:3;s:3:"ddd";i:4;s:3:"www";}}
read.php
<?php
include "test.php";
//讀出字符串從文件中
$str = file_get_contents("objstr.txt");
//返串行化
$p = unserialize($str);
$p->say();
test.php
<?php
/*
* 魔術(shù)方法忘伞, 只有PHP語(yǔ)言中存在
*
*
* __construct()
*
* __destruct()
*
* __set()
*
* __get()
*
* __isset()
*
* __unset()
*
* 1. 自動(dòng)調(diào)用, 但不同的魔術(shù)方法薄翅,有自己的調(diào)時(shí)機(jī)
* 2. 都是以"__"開始的方法
* 3. 所有的魔術(shù)方法,方法名都是固定的
* 4. 如果不寫氓奈, 就不存在翘魄, 也就沒有默認(rèn)的功能
*
*
*
* __toString()
*
* 1. 是在直接使用 echo print printf輸出一個(gè)對(duì)象引用時(shí),自動(dòng)調(diào)用這個(gè)方法
* 2. 將對(duì)象的基本信息放在__toString()方法內(nèi)部舀奶, 形成自字符串返回暑竟。
* 3. __toString()方法中, 不能有參數(shù)育勺, 而且必須返回一個(gè)字符串
*
*
* 克隆對(duì)象
* 1. 使用clone這個(gè)關(guān)鍵 復(fù)制了一個(gè)對(duì)象
*
*
* __clone()魔術(shù)方法
*
* 1. 是在克隆對(duì)象時(shí)但荤,自動(dòng)調(diào)用的方法
* 2. 作用:和構(gòu)造方法一樣, 是對(duì)新克隆的對(duì)象進(jìn)行初使化
* 3. 在這個(gè)方法中$this代表的是副本, 所以就可以給所有副本的成員初使化
*
* __call()
*
* 1. 就是在調(diào)用一個(gè)對(duì)象中不存的方法時(shí)涧至,自動(dòng)調(diào)用的方法
* 2. 有兩個(gè)參數(shù)纱兑, 第一個(gè)參數(shù)是, 調(diào)用的不存的方法的方法名化借, 第二個(gè)參數(shù)是潜慎,調(diào)用這個(gè)不存的方法的方法參數(shù)
* 3. 作用:可以寫提示,但這個(gè)不是主要的功能蓖康。 將方法的功能相似铐炫, 但方法名還要不同的, 就可以采用這個(gè)方式來完成
*
* 串行化(序列化)
*
* 1. 將對(duì)象轉(zhuǎn)成字符串(不用看懂) --- 串行化
* 2. 將字符串轉(zhuǎn)回對(duì)象 --- 返串行化
*
*
* 注意(串行化的時(shí)機(jī)):
*
* 1. 將對(duì)象在網(wǎng)絡(luò)中傳輸
* 2. 將對(duì)象持久保存
*
*
*
*
*/
class Person {
public $name;
public $age;
public $sex;
public $marr = array("aaa", "bbb", "ccc", "ddd", "www");
function __construct($name, $age, $sex) {
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
function say() {
echo "我的名子是:{$this->name}蒜焊,我的年齡是:{$this->age}倒信,我的性別是:{$this->sex}。<br>";
}
function __toString() {
return "aaaaaaaaaaaaaaaaaaa<br>";
}
function __destruct() {
echo "{$this->name} ###########<br>";
}
function __clone() {
$this->name="克隆的";
$this->age=0;
}
function __call($method, $args) {
if(in_array($method, $this->marr)) {
echo $args[0]."<br>";
}else{
echo "你調(diào)用的方法{$method}()不存在!<br>";
}
}
/*
function aaa($a) {
echo $a;
}
function bbb($b) {
echo $b;
}
function ccc($c) {
echo $c;
}
function ddd($d) {
echo $d;
}
*/
}
write.php
<?php
include "test.php";
//對(duì)象
$p = new Person("張三", 10, "男");
//將對(duì)象串行化
$str = serialize($p);
//將字符串保存在文件夾objstr.txt中
file_put_contents("objstr.txt", $str);
echo "對(duì)象轉(zhuǎn)完字符串泳梆, 保存到文件中成功!";