php反序列化--1--PHP序列化

目录

一、什么是php序列化?

二、在php中怎么进行序列化?

三、不同数据类型的序列化后的表达方式

1、空-NULL

2、整形

3、浮点型

4、boolean型

5、字符型

6、数组

7、对象序列化-公有修饰符

8、对象序列化-私有修饰符

9、对象序列化-保护修饰符

10、对象中调用对象的序列化


一、什么是php序列化?

序列化(Serialization)是将对象的状态信息(属性)转换为可以存储或传输的形式的过程。

将对象或数组转化为可存储/传输的字符串

二、在php中怎么进行序列化?

使用函数serialize()来将对象或者数组进行序列化,并返回一个包含字节流的字符串来表示。

三、不同数据类型的序列化后的表达方式

1、空-NULL

代码:

<?php
  $s=null;
  echo serialize($s);
?>

结果 :

N;

2、整形

代码:

<?php
  $s=123;
  echo serialize($s);
?>

结果:

i:123;

说明:

i代表int:123代表内容;

3、浮点型

代码:

<?php
  $s=123.11;
  echo serialize($s);
?>

结果:

d:123.11;

说明:

d代表double:123.11代表内容;

4、boolean型

<?php
  $s=true;
  $u=false;
  echo serialize($s);
  echo serialize($u);
?>

b:1;b:0;

 说明:

b代表boolean:1代表为true;

b代表boolean:0代表为false;

5、字符型

<?php
  $s='summer';

  echo serialize($s);

?>

s:6:"summer";

说明:6代表了后边字符串的长度,因为若字符串$s="s""unmmer"无法判断哪个"是字符串哪个是代码,所以需要靠前边数值确定字符串的长度。

s代表string:6字符串长度:"summer字符串内容";

6、数组

<?php
  $s=array('spring','summer','autumn','winter');
   echo serialize($s);

?>

a:4:{i:0;s:6:"spring";i:1;s:6:"summer";i:2;s:6:"autumn";i:3;s:6:"winter";}

说明:php数组下标默认是从0开始

aarray:4数组中的元素个数:{i:0数组中第1个元素;s第1个元素的数据类型string:6第1个元素数据长度:"spring第1个元素数据内容";i:1数组中第2个元素;s第2个元素的数据类型string:6第2个元素数据长度:"summer第2个元素数据内容";i:2数组中第3个元素;s第3个元素的数据类型string:6第4个元素数据长度:"autumn第3个元素数据内容";i:3数组中第4个元素;s第4个元素的数据类型string:6第4个元素数据长度:"winter第4个元素数据内容";}

7、对象序列化-公有修饰符

只序列化成员属性,不序列化成员方法

<?php

class summer{
    public $s='spring';  #定义了一个成员属性-s,并赋值为spring
    public $u='chuntian';
    function     winter(){#定义了一个名为winter的成员方法
        echo $this->s;  #把s的方法输出出来
    }
}
$a = new summer();  #summer类实例化成一个对象赋值给a
echo serialize($a)    #把a序列化并展示出来

?>

结果:

O:6:"summer":2:{s:1:"s";s:6:"spring";s:1:"u";s:8:"chuntian";}

 说明:

O表示“Object”,在面向对象编程中译作“对象”:6表示类名的长度:"summer类名":2表示类中属性的个数:{s表示第1个属性名称为string类型:1表示第1个属性名称长度:"s第1个属性名称的内容";s表示第1个属性内容为string类型:6表示第1个属性内容长度:"spring第1个属性内容";s表示第2个属性名称为string类型:1表示第2个属性名称长度:"u第2个属性名称的内容";s表示第2个属性内容为string类型:8表示第2个属性内容长度:"chuntian第2个属性内容";}

8、对象序列化-私有修饰符

代码:

<?php

class summer{
    public $s='spring';  #定义了一个成员属性-s,并赋值为spring
    private $u='chuntian';
    function     winter(){#定义了一个名为winter的成员方法
        echo $this->s;  #把s的方法输出出来
    }
}
$a = new summer();  #summer类实例化成一个对象赋值给a
echo serialize($a)    #把a序列化并展示出来

?>

结果:

O:6:"summer":2:{s:1:"s";s:6:"spring";s:9:"summeru";s:8:"chuntian";}

说明:

O表示“Object”,在面向对象编程中译作“对象”:6表示类名的长度:"summer类名":2表示类中属性的个数:{s表示第1个属性名称为string类型:1表示第1个属性名称长度:"s第1个属性名称的内容";s表示第1个属性内容为string类型:6表示第1个属性内容长度:"spring第1个属性内容";s表示第2个属性名称为string类型:9表示第2个属性名称长度:"summeru第2个属性名称的内容";s表示第2个属性内容为string类型:8表示第2个属性内容长度:"chuntian第2个属性内容";}

注:

可以看到私有修饰符定义的变量序列化后的名称长度和"summeru"的长度不同,且属性名称也与代码中的不同。

其中属性名称变成了"summeru" --属性从public变成private后,属性名称就变成  类名 + 属性名称

同时看出来长度也多出两个字符,那是因为私有属性中,长度为9的summeru其实在summer的首尾拥有两个空位,分别各占取一个字符串长度,summeru真实情况下应该写作 %00summer%00u,多出的两个字符串长度就是这两个%00。

实际保护属性名称为:空格 + 类名 + 空格 + 属性名称。(其中空格并不是真正的空格,是一个占一个字符串长度的特殊字符)

URL编码为:%00 +类名 + %00 + 属性名称。

 

9、对象序列化-保护修饰符

代码:

<?php
class test{
    protected $pub='benben';
    function jineng(){
        echo $this->pub;
    }
}
$a = new test();
echo serialize($a);
?>

 结果:

O:4:"test":1:{s:6:"*pub";s:6:"benben";}

说明:

名称pub前多出一个*,并且名称长度也与实际观察到的长度不符合,多出了两个字符串长度。

特别说明:保护属性中多出的两个字符串长度:

实际保护属性名称为:空格 + * + 空格 + 属性名称。(其中空格并不是真正的空格,是一个占一个字符串长度的特殊字符)

URL编码为:%00 + * + %00 + 属性名称。

10、对象中调用对象的序列化

代码:

<?php

class summer{
    public $s='spring';  #定义了一个成员属性-s,并赋值为spring
    function     winter(){#定义了一个名为winter的成员方法
        echo $this->s;  #把s的方法输出出来
    }
}
class summer2{
    var $u;
}
$b = new summer();
$a = new summer2();  
$a->u =$b;
echo serialize($a)    #把a序列化并展示出来

?>

结果:

O:7:"summer2":1:{s:1:"u";O:6:"summer":1:{s:1:"s";s:6:"spring";}}

 说明:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/802755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 回溯算法

什么时候不需要startIndex? 全排列&#xff1a;1在[1,2]中已经使用过了&#xff0c;但是在[2,1]中还要在使用一次1&#xff0c;所以处理排列问题就不用使用startIndex了&#xff1b;电话号码的字母组合&#xff1a;如果是多个集合取组合&#xff0c;各个集合之间相互不影响&a…

景区导航导览系统:基于AR技术+VR技术的功能效益全面解析

在数字化时代背景下&#xff0c;游客对旅游体验的期望不断提升。游客们更倾向于使用手机作为旅行的贴身助手&#xff0c;不仅因为它能提供实时、精准的导航服务&#xff0c;更在于其融合AR&#xff08;增强现实&#xff09;、VR&#xff08;虚拟现实&#xff09;等前沿技术&…

汽车免拆诊断案例 | 卡罗拉急加速抖动故障排除

车型信息 2017年改款卡罗拉&#xff0c;排量1.2T&#xff0c;行驶里程48800公里。 故障现象 车辆不管在什么状态下&#xff0c;只要是平缓加速&#xff0c;都不会有抖动。车辆静止时&#xff0c;急加速时&#xff0c;也不会有抖动。但是车速达40公里/小时以上&#xff0c;急加…

SQL注入问题

一、什么是sql注入 public class TestSql {public static void main(String[] args) {Scanner inScanner new Scanner(System.in);System.out.println("请输入用户名");String username inScanner.nextLine();System.out.println("请输入密码");String …

python-区间内的真素数(赛氪OJ)

[题目描述] 找出正整数 M 和 N 之间&#xff08;N 不小于 M&#xff09;的所有真素数。真素数的定义&#xff1a;如果一个正整数 P 为素数&#xff0c;且其反序也为素数&#xff0c;那么 P 就为真素数。 例如&#xff0c;11&#xff0c;13 均为真素数&#xff0c;因为 11 的反序…

JuiceFS缓存特性

缓存 对于一个由对象存储和数据库组合驱动的文件系统&#xff0c;缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存&#xff0c;再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互&#xff0c;采用缓存技…

vue3配置代理

vite.config.js中的内容&#xff1a; 在这里配置访问后台的地址 import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue()],server: {open: false,port: 3000,proxy: {/api: {target: http://127.0.0.1:9001, // 后…

【论文阅读】MCTformer+:弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器一、介绍1.1 WSSS背景1.2 WSSS策略 二、联系工作2.1 弱监督语义分割2.2 transformers的可视化应用 三、MULTI-CLASS TOKEN TRANSFORMER3.1 Multi-class t…

【Apache POI】Java解析Excel文件并处理合并单元格-粘贴即用

同为牛马&#xff0c;点个赞吧&#xff01; 一、Excel文件样例 二、工具类源码 import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory; import org.springframework.web.multip…

【Linux】进程信号 --- 信号产生

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【Android】活动的生命周期与启动模式

【Android】活动的生命周期与启动模式 活动的生命周期 返回栈 返回栈&#xff08;Back Stack&#xff09;是Android操作系统中用于管理用户在应用中导航历史的一种数据结构。它允许用户通过按下硬件返回键或调用系统返回功能来回到之前的操作步骤。以下是返回栈的一些关键特…

R与机器学习系列|15.可解释的机器学习算法(Interpretable Machine Learning)(中)

在上次推文中我们介绍了几种可解释机器学习算法的常见方法&#xff0c;包括置换特征重要性、偏依赖图和个体条件期望及其实现。本次我们将继续介绍其他的用来解释机器学习算法的方法。 1.特征交互&#xff08;Feature interactions&#xff09; 1.1介绍 在机器学习中&#xff0…

SpringCache介绍

SpringCache是Spring提供的缓存框架。提供了基于注解的缓存功能。 SpringCache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff08;只需要导入不同的Jar包即可&#xff09;&#xff0c;如EHCache&#xff0c;Caffeine&#xff0c;Redis。 2个重要依赖已经导入&a…

肿瘤微生态研究利器——5R 16S rDNA测序

肿瘤微生物组&#xff08;Tumor Microbiome&#xff09;是肿瘤微环境中不可或缺的成员&#xff0c;肿瘤内微生物群通过多种机制影响肿瘤发展&#xff0c;在不同类型的肿瘤中&#xff0c;肿瘤内微生物群的组成和丰度具有高度异质性。由于它们的低生物量和其他障碍&#xff0c;全…

Web常见漏洞之po解

暴力破解 概述应用场景实验工具实训准备实训开始四种模式 验证码绕过前端验证码验证码有存活周期 概述 暴力破解是Web漏洞里常见的一种渗透方式&#xff0c;攻击者会试图通过尝试各种可能的用户名和密码组合来猜测密码或密钥&#xff0c;直到猜对为止123。攻击者会经常使用自动…

使用base64通用文件上传

编写一个上传文件的组件 tuku,点击图片上传后使用FileReader异步读取文件的内容&#xff0c;读取完成后获得文件名和base64码&#xff0c;调用后端uploadApi,传入姓名和base64文件信息&#xff0c;后端存入nginx中&#xff0c;用于访问 tuku.ts组件代码&#xff1a; <templa…

win10删除鼠标右键选项

鼠标右键菜单时&#xff0c;发现里面的选项特别多&#xff0c;找一下属性&#xff0c;半天找不到。删除一些不常用的选项&#xff0c;让右键菜单变得干净整洁。 1、按下键盘上的“winR”组合按键&#xff0c;调出“运行”对话框&#xff0c;输入“regedit”命令&#xff0c;点击…

mybatisPlus和mybatis的版本冲突问题、若依换成MP、解决git无法推送、使用若依框架的swagger、以后再遇到团队项目应该怎么做。

20240716 一. mybatisPlus和mybatis的版本冲突问题1. 使用前的准备2. 我遇到了一个很严重的问题。3. 解决问题&#xff0c;好吧也没解决&#xff0c;发现问题&#xff01;&#xff01; 二、该死的git&#xff01;&#xff01;&#xff01;&#xff01;1. 解决无法在idea中使用g…

2.RabbitMQ相关概念

介绍 RabbitMQ是一个消息中间件&#xff0c;接受并转发消息。它接收、存储和转发消息数据。 四大核心概念&#xff1a; 1.生产者 产生数据发送消息的程序是生产者。 2.消费者 3.队列 每一个队列对应一个消费者。 如果两个消费者对应同一个队列&#xff0c;那么队列中的…

R绘制Venn图及其变换

我自己在用R做各种分析时有不少需要反复用到的基础功能&#xff0c;比如一些简单的统计呀&#xff0c;画一些简单的图等等&#xff0c;虽说具体实现的代码也不麻烦&#xff0c;但还是不太想每次用的时候去找之前的代码。 索性将常用的各种函数整成了一个包&#xff1a;pcutils…