在PHP下实现持久化

在PHP下实现持久化

“持久化”这个概念是笔者在Java中首次接触到的,通过这个特性,可以将应用程序对象转化成一系列字节流(这被称作对象序列化),以适应网络传输或保存。最奇妙的是,被序列化的对象还可以被重新装配,还原成以前的样子。这意味着,该机制能自动补偿操作系统间的差异。换句话说,一个在Windows系统的机器上被序列化的对象可以通过网络传输到一台Linux系统的机器上准确无误的重新装配。“持久化”可以使应用程序对象不受应用程序运行时间的限制——可以将一个对象序列化,然后保存到磁盘上,在再次需要时进行装配,能圆满实现一种“持久”效果。

令人兴奋的是,PHP也支持这一特性,而且从PHP3就开始支持了,它是通过Serialize()和Unserialize()这两个函数来实现的。其实,像ASP这样的开发环境也隐式支持这一特性——在Session或Application对象中保存应用程序对象就是一种持久化的表现,但遗憾的是,ASP并没有显式提供这一接口。

在PHP中,几乎任何类型(这包括Integer、Boolean、Float、Array和Object)的变量都可以被序列化。之所以说“几乎”,是因为唯独Resource类型不支持序列化,这完全是因为PHP中的Resource类型其实是指针的缘故。至于String类型,由于它本身就是字节流,所以根本没有序列化的必要。

下面将介绍Serialize()和Unserialize()两个函数的用法:

string serialize (mixed value):返回value被序列化后的字节流;
mixed unserialize (string str):返回将str进行装配后的对象。

下面是这两个函数的应用实例:

<?php
//class.inc.php文件,用于保存类的信息

//用于测试的用户信息类
class Userinfo
{
var $username;
var $password;
var $datetime;
function Userinfo($username, $password, $datatime)
{
$this -> username = $username;
$this -> password = $password;
$this -> datetime = $datetime;
}
function output()
{
echo "User Information -> <br>";
echo "Username: ".$this -> username."<br>";
echo "Password: ".$this -> username."<br>";
echo "Datetime: ".$this -> username."<br>";
}
}
?>

<?php
//login.php文件,用于注册新用户

//导入类文件
require_once("class.inc.php");

//新建对象
$user = new Userinfo($_POST['username'], $_POST['password'], date("Y-n-j H:i:s"));
//序列化对象
$user = Serialize($user);

//将对象写入本地数据库
$con = mysql_connect();
mysql_select_db("test");
mysql_query($con, "INSERT INTO testTable (id, userinfo) VALUES ('1', '$user')");
mysql_close($con);
?>

<?php
//userinfo.php文件,用于显示用户信息

require_once("class.inc.php");

//从数据库中取出对象
$con = mysql_connect();
mysql_select_db("test");
$result = mysql_query($con, "SELECT * FROM testTable WHERE id=1");
$record = mysql_fetch_assoc($result);
$user = Unserialize($record['userinfo']);
//输出用户信息
$user -> output();
mysql_free($result);
mysql_close($con);
?>

在对象序列化中,最重要的是在“装配”的页面中一定要包含该对象的类的定义信息,否则会出现错误。当然,上里只是用于测试,在实际的应用中,为了防止序列化后的对象的内容被更改,一般还要对字节流进行“数字签名”,在装配时,再对“签名”进行验证,以防止对象信息被非法篡改。

时间: 2024-09-15 19:01:21

在PHP下实现持久化的相关文章

shh项目错误-MyEclipse下生成持久化类,查询出错了

问题描述 MyEclipse下生成持久化类,查询出错了 java.lang.RuntimeException: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [select user0_.userID as col_0_0_, user0_.userName as col_1_0_, user0_.userPassword as col_2_0_ from

亲密接触:在PHP下实现持久化

"持久化"这个概念是笔者在Java中首次接触到的,通过这个特性,可以将应用程序对象转化成一系列字节流(这被称作对象序列化),以适应网络传输或保存.最奇妙的是,被序列化的对象还可以被重新装配,还原成以前的样子.这意味着,该机制能自动补偿操作系统间的差异.换句话说,一个在Windows系统的机器上被序列化的对象可以通过网络传输到一台Linux系统的机器上准确无误的重新装配."持久化"可以使应用程序对象不受应用程序运行时间的限制--可以将一个对象序列化,然后保存到磁盘上,

3种方法来创建轻量、持久化的Xubuntu Linux USB系统盘

3种方法来创建轻量.持久化的Xubuntu Linux USB系统盘 使用Universal USB Install创建持久化USB Xubuntu系统盘 这个教程为你介绍如何使用Xubuntu Linux创建一个轻量并且持久化的Linux USB系统盘. 译者注:持久化Linux USB系统盘(Persistent Linux USB drive),安装在优盘的Linux系统,允许用户保存数据到优盘而不是仅仅将这些修改留在内存中.这些数据可以在重启后恢复并且重新使用,甚至是在其他的机器上面启动

在Windows环境下用Yeoman构建AngularJS项目

本文将通过 Yeoman 创建一个 AngularJS 应用,同时 也能感受到 Grunt 和 Bower 的功能. 认识Yeoman Yeoman 是一位戴帽子.立意奇颖的人. Yeoman 是一套工作流程. Yeoman 是Web 应用开发脚手架. 通过很少的命令,就能给你整个应用或者独立的模块生成模板代码,比如控制器或者模型.Yeoman 可以启动预览 Web 服务器,观察文件,如果被编辑,就会重新加载的变化和编译你的 Sass . Yeoman 也可以运行单元测试,最小化代码,优化图像等

Android与db4o的完美结合:Password Manager

项目简介 这里提供的Password Manager项目是Steven Osborn编写的PasswordSafe(在Apache License下发行)的改写版,目前已经实现了在Android平台下的基本密码管理功能.项目源 代码中使用db4o代替了SQLite,这样不但使持久化处理更为直观,而且使开发过程更快速. 整个应用更加高效. 在这个项目中,你可以获得以下资源: ◆db4o与SQLite之间在基本持久化操作上的比较 ◆完整的Android示例应用代码 ◆应用运行时的视频演示 基本功能

JPA总结

简介:         Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是Hibernate框架的作者, 它吸取了目前Java持久化技术的优点,旨在规范.简化Java对象的持久化工作.使用JPA持久化对象,并不是依赖于某一个ORM框架.因此Hibernate是它的一种实现.除了Hiberna

未雨绸缪,迎接运维新时代—— Tech Neo第十六期技术沙龙

运维发展历程与工业革命异曲同工,工业的三次革命分别是机械化.电气化与信息化,运维则是原始手工.脚本与自动化工具.那么工业4.0悄然来临的今天,智能化又将会给运维带来哪些影响?坦白讲,AIOps是新概念,目前并没有准确且广泛使用的定义,对AIOps的认知也会随实践.反思和讨论的不断积累发生演变.但AIOps所指代的整体趋势是毋庸置疑的,智能化将逐步走进IT行业乃至社会生活的各个方面. 今天, 由51CTO 主办的第十六期以"Tech Neo"为主题的技术沙龙活动如期举行,此次沙龙邀请了来

JPA学习笔记-JPA基础

1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是hibernate框架的作者,因此Hibernate作为Jboss服务器中JPA的默认实现,Oracle的Weblogic使用EclipseLink(以前叫TopLink)作为默认的JPA实现,IBM的Websphere和S

一起谈.NET技术,走向ASP.NET架构设计——第四章—业务层分层架构(中篇)

在上一篇文章中,我们讨论了两种组织业务逻辑的模式:Transaction Script和Active Record.在本篇中开始讲述Domain Model和Anemic Model. Domain Model 在开发过程中,我们常常用Domain Model来对目标的业务领域建模.通过Domain Model建模的业务类代表了目标领域中的一些概念.而且,我们会看到通过Domain Model建模的一些对象模拟了业务活动中的数据,有的对象还反映了一些业务规则. 我们就来看看电子商务系统的开发,在