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


    目录

    一、什么是php序列化?

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

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

    1、空-NULL

    2、整形

    3、浮点型

    4、boolean型

    5、字符型

    6、数组

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

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

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

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


    一、什么是php序列化?

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

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

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

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

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

    1、空-NULL

    代码:

    1. $s=null;
    2. echo serialize($s);
    3. ?>

    结果 :

    N;

    2、整形

    代码:

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

    结果:

    i:123;

    说明:

    i代表int:123代表内容;

    3、浮点型

    代码:

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

    结果:

    d:123.11;

    说明:

    d代表double:123.11代表内容;

    4、boolean型

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

    b:1;b:0;

     说明:

    b代表boolean:1代表为true;

    b代表boolean:0代表为false;

    5、字符型

      $s='summer';

      echo serialize($s);

    ?>

    s:6:"summer";

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

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

    6、数组

      $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、对象序列化-公有修饰符

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

    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、对象序列化-私有修饰符

    代码:

    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、对象序列化-保护修饰符

    代码:

    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、对象中调用对象的序列化

    代码:

    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";}}

     说明:

  • 相关阅读:
    现代软件为什么要采用微服架构
    java计算机毕业设计教师管理系统源码+mysql数据库+系统+lw文档+部署
    uniapp的安装与基础
    ICG-TCO,吲哚菁绿标记点击化学试剂,荧光标记反式环辛烯
    UVM driver和monitor中阻塞和非阻塞
    VSCode远程调试Python代码环境配置
    国庆放假作业2
    鸿蒙HarmonyOS实战-Web组件(基本使用和属性)
    删除共享文件凭据脚本
    03-关系和非关系型数据库对比
  • 原文地址:https://blog.csdn.net/lushuaibao/article/details/140280115