对象的存储与传输

在实际项目应用中,有些任务在一两个页面是无法完成的,由于变量到脚本执行完毕就释放,我们本页所生成的对象想在其它页面使用时便碰到了麻烦。

如果需要将对象及其方法传递到我们想使用对象的页面,比较简单可行的办法是将对象序列化后存储起来或直接传输给需要的页面,另一种办法是将对象注册为 session 变量。

序列化对象

对象序列化,就是将对象转换成可以存储的字节流。当我们需要把一个对象在网络中传输时或者要把对象写入文件或是数据库时,就需要将对象进行序列化。

序列化完整过程包括两个步骤:一个是序列化,就是把对象转化为二进制的字符串,serialize() 函数用于序列化一个对象;另一个是反序列化,就是把对象被序列转化的二进制字符串再转化为对象,unserialize() 函数来反序列化一个被序列化的对象。这样整个过程下来,对象内的类型结构及数据都是完整的。

语法:

string serialize( mixed value )

mixed unserialize( string str [, string callback] )

例子:

class Person {

private $name;

private $age;

function __construct($name, $age) {

$this->name = $name;

$this->age = $age;

}

function say() {

echo "我的名字叫:".$this->name."
";

echo " 我的年龄是:".$this->age;

}

}

$p1 = new Person("张三", 20);

$p1_string = serialize($p1);

//将对象序列化后写入文件

$fh = fopen("p1.text", "w");

fwrite($fh, $p1_string);

fclose($fh);

?>

打开 p1.text 文件,里面写入的内容如下:

O:6:"Person":2:{s:12:" Person name";s:4:"张三";s:11:" Person age";i:20;}

但通常不去直接解析上述序列化生成的字符。

反序列化:

class Person {

private $name;

private $age;

function __construct($name, $age) {

$this->name = $name;

$this->age = $age;

}

function say() {

echo "我的名字叫:".$this->name."
";

echo " 我的年龄是:".$this->age;

}

}

$p2 = unserialize(file_get_contents("p1.text"));

$p2 -> say();

?>

运行该例子,输出:

我的名字叫:张三

我的年龄是:20

提示

对象注册为 session 变量

当用户数量很多时,可以考虑用 session 来保存对象。关于 session 的更多信息,请参见《PHP Session》。

例子:

session_start();

class Person {

private $name;

private $age;

function __construct($name, $age) {

$this->name = $name;

$this->age = $age;

}

function say() {

echo "我的名字叫:".$this->name."
";

echo " 我的年龄是:".$this->age;

}

}

$_SESSION["p1"] = new Person("张三", 20);

?>

读取 session :

session_start();

class Person {

private $name;

private $age;

function __construct($name, $age) {

$this->name = $name;

$this->age = $age;

}

function say() {

echo "我的名字叫:".$this->name."
";

echo " 我的年龄是:".$this->age;

}

}

$_SESSION["p1"] -> say();

?>

运行该例子,输出:

我的名字叫:张三

我的年龄是:20

与序列化一样,注册对象为 session 变量时并不能保存其方法,所以在读取 session 变量的时候,当前文件必须包含对应的类或者 require 对应的类文件。

由于序列化对象不能序列化其方法,所以在 unserialize 的时候,当前文件必须包含对应的类或者 require 对应的类文件。

序列化只能用于有限用户的情况下,因为需要为每个用户单独存储或写入文件,且保证文件名不能重复。在用户不能正常退出浏览器的情况下,不能保证文件被删除。

这就是微学网-程序员之家为你提供的"php类讲解17:PHP 对象的存储与传输(序列化 seria"希望对你有所帮助.本文来自网络,转载请注明出处:http://www.weixuecn.cn/article/7383.html

php 对象 内存格式,php类讲解17:PHP 对象的存储与传输(序列化 seria相关推荐

  1. 【C++学习】类与对象(一)——类的定义与对象实例

    一.面向对象程序设计的基本特点 1.1 抽象 面向对象方法中的抽象 ,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程. 一个问题的抽象包括:数据抽象和行为抽象(或被称为功能抽象 ...

  2. c++一个类创建多个对象_C ++ | 创建一个类的多个对象

    c++一个类创建多个对象 In the below program, we are creating a C++ program to create multiple objects of a cla ...

  3. Java中匿名子类 的 匿名对象、匿名子类 的 非匿名对象、非匿名类 的 匿名对象、非匿名类 的 非匿名对象

    /*** @Author: YuShiwen* @Date: 2020/11/18 2:06 PM* @Version: 1.0*/ public class AnonymousTest {publi ...

  4. python创建类的两个对象_Python为一个类创建多个对象

    分步教程 要读取文件内容,请使用io.open.如果任何名称有强调字符,请不要忘记指定文件编码.在with io.open('students.txt', mode="r", en ...

  5. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  6. 修改对象的某个属性的值_什么是类,什么是对象

    大家好,在我之前的教程中分别讲了"VBA代码解决方案""VBA数据库方案""VBA字典和数组方案",通过对这三套教程的学习,我们对VBA的基 ...

  7. 22-10-14 西安 spring循环依赖、对象内存布局、synchronized锁升级

    关于锁升级参考了周阳老师在b站的juc视频,阳哥讲的很好 尚硅谷2022版JUC并发编程(对标阿里P6-P7)_哔哩哔哩_bilibili spring循环依赖 1.循环依赖问题 什么是循环依赖 默认 ...

  8. python对象内存模型

    原文:Python的垃圾回收机制(二)之内存模型 1. Python对象内存模型 首先介绍一下Python对象的内存模型,如下图1所示: 图1. PyObject对象内存模型 上图可以看到,一个PyO ...

  9. Quartz业务类无法注入Spring对象问题

    tags: 解决错误, titile: Quartz业务类无法注入Spring对象问题 Quartz业务类无法注入Spring对象问题 在刚开始遇到的时候还以为是Spring配置哪里错误了,结果搞了那 ...

最新文章

  1. 32款iOS开发插件和工具介绍[效率]
  2. 小白进阶之GIT篇(1)——创建了分支进行了代码修改但是切换回master分支运行发现代码在master分支也会生效
  3. java nio改造io,java – 将NIO与IO混合
  4. arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准
  5. Win10 20H2正式发布,对比旧版新功能一览
  6. python中常用的序列化模块_python 序列化,常用模块
  7. 如何得到所有子对象_对象可能会迟到,但它永远不会缺席
  8. ken沈oracle,甲骨文宣布推出Oracle商务软件
  9. 新华系“雄文”为何引发游戏产业3000亿市值蒸发?
  10. nginx ngx_event_t结构体详解
  11. 被“需要”的无功功率
  12. 声网连麦+直播+视频+游戏“史上最强”社交直播方案 打造陌陌全新8.0改版
  13. 获取保存在路由器中的ADSL账号和密码
  14. 低代码行业风涌云起,他们靠什么跻身全球第一阵营?
  15. 三大运营商5G套餐出炉:有什么区别呢?
  16. 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道
  17. ybt 神(bian)奇(tai)题目总结合集(上)
  18. 定了,又一个网盘宣布不限速了
  19. gitee码云的使用
  20. 端口映射软件大-比较|内网端口映射器使用方法

热门文章

  1. (STITP)jotm-btp项目的Demo分析
  2. win8系统笔记本装成win7
  3. 射频微波PCB板材信息
  4. MSP432P401R LaunchPad教程(三)滴答定时器
  5. 大学生计算机技能应用大赛比赛流程【Java】
  6. 同事电脑刚进入桌面几秒,就自动重启
  7. the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winpty’ 解决方案
  8. android 盒子录屏apk,三种用于安卓录屏的解决方案
  9. matlab函数之随机函数-randperm,sort,rand,randint
  10. python 爬取直播弹幕视频_调用斗鱼API爬取直播间弹幕信息(用户昵称及弹幕内容)...