PHP序列化
变量序列化
- 定义:
- 序列化是将变量转换成可以保存或传输的字符串的过程;
- 反序列化就是在需要的时候把已序列化的字符串转换成变量的过程;
- 作用:序列化有利于数据的存储和传输
序列化函数 serialize()
- 描述:把变量转换成一个可以存储的值;
- 语法:
string serialize(mixed $value)
- 参数:
$value
可以是除资源意外的任意类型数据 - 返回值:序列化后的字符串
<?php
class Student{
private $name;
private $age;
public function showInfo(){
echo "{$this->name}的年龄是{$this->age}岁!";
}
}
//序号化一个对象
$student = new Student();
echo "对象序列化:".serialize($student)."<br>";
//把序列化后端内容存储到本地
file_put_contents('./obj.txt',serialize($student));
//序列化一个数组
$arr = ['PHP','html','css','javascript'];
echo "数组象序列化:".serialize($arr)."<br>";
//把序列化后端内容存储到本地
file_put_contents('./array.txt',serialize($arr));
//序列化一个字符串
$str = "Hello World!";
echo "字符串序列化:".serialize($str)."<br>";
//把序列化后端内容存储到本地
file_put_contents('./string.txt',serialize($str));
?>
输出结果
对象序列化:O:7:"Student":2:{s:13:"Studentname";N;s:12:"Studentage";N;}
数组象序列化:a:4:{i:0;s:3:"PHP";i:1;s:4:"html";i:2;s:3:"css";i:3;s:10:"javascript";}
字符串序列化:s:12:"Hello World!";
反序列化函数 unserialize()
- 描述:把一个已序列化的字符串,创建PHP能识别的值
- 语法:
mixeed unserialize(string $str)
- 参数:
$str
为序列化后的字符串 - 返回值:返回转换后的值,可为integer、float、string、array、或object。如果传递的字符不能反序列化,则返回falsel,并且产生一个E_NOTICE提示信息。
<?php
//把序列化后的对象、数组、和字符串从文件中读取出来
$obj = file_get_contents('./obj.txt');
$arr= file_get_contents('./array.txt');
$str = file_get_contents('./string.txt');
echo "<pre>";
echo "对象序列化内容:".$obj;
echo "<br>反序列化后的内容:<br>";
var_dump(unserialize($obj));
echo "数组序列化内容:".$arr;
echo "<br>反序列化后的内容:<br>";
print_r(unserialize($arr));
echo "字符串序列化内容:".$str;
echo "<br>反序列化后的内容:<br>";
echo unserialize($str);
?>
输出结果
对象序列化内容:O:7:"Student":2:{s:13:"Studentname";N;s:12:"Studentage";N;}反序列化后的内容:
反序列化后的内容:
object(__PHP_Incomplete_Class)#1 (3) {
["__PHP_Incomplete_Class_Name"]=>
string(7) "Student"
["name":"Student":private]=>
NULL
["age":"Student":private]=>
NULL
}
数组序列化内容:a:4:{i:0;s:3:"PHP";i:1;s:4:"html";i:2;s:3:"css";i:3;s:10:"javascript";}
反序列化后的内容:
Array
(
[0] => PHP
[1] => html
[2] => css
[3] => javascript
)
字符串序列化内容:s:12:"Hello World!";
反序列化后的内容:
Hello World!
对象序列化
- 对象序列化过程,与其他变量数据一样
- 对象序列化只会序列化对象的成员属性
- 当对象序列化时,
serialize()
函数会检查类中是否存在魔术方法__sleep()
,如果存在,则会调用该方法,根据该方法返回的数组指定序列内容。使用该方法可以清理对象,并返回一个需要被序列化的变量名称的数组。
<?php
class Student{
private $name;
private $age;
public function showInfo(){
echo "{$this->name}的年龄是{$this->age}岁!";
}
//指定存储的属性,age属性不会被存储
public function __sleep(){
return array('name');
}
}
//序号化一个对象
$student = new Student();
echo "对象序列化:".serialize($student)."<br>";
//把序列化后端内容存储到本地
file_put_contents('./obj.txt',serialize($student));
?>
输出结果
对象序列化:O:7:"Student":1:{s:13:"Studentname";N;}