什么是PHP序列化输出中的数字

时间:2013-02-05 20:38:26

标签: php class object serialization numbers

class Aclas {

    private $v = 1;
    private $z;
    protected $y;
    public $xy;
}

$obja = new Aclas;
echo serialize( $obja );

我得到如下输出

O:5:"Aclas":4:{s:8:"Aclasv";i:1;s:8:"Aclasz";N;s:4:"*y";N;s:2:"xy";N;}

但有人请在打开大括号后立即告诉我s:8是什么。

2 个答案:

答案 0 :(得分:1)

{s:8:"Aclasv",是字符串,长度为8。

我正在寻找文档一秒钟。

<强>更新 似乎没有找到任何文件。也许我会寻找链接corresp。 PHP源代码......我现在也很好奇。可能更容易进行逆向工程并理解它。

最佳链接 这非常酷,代码有完整的解析器:https://github.com/ktomk/Serialized

  

Serialized是一组可以将序列化数据解析为规范化的类   表示(半结构化数据或S表达式)。

答案 1 :(得分:-1)

首先,这个问题没有任何特别意义,因为:

  • serialize仅通过反序列化生成可以使用的值的可存储表示!
  • 其输出不是“标准化”。它不是JSON。您无法保证在一个版本的PHP中序列化某些内容并尝试在不同版本中反序列化()将起作用。
  • 尝试理解和解码它生成的字符毫无意义。

但如果你还想知道:

s:8表示8字节的字符串。 它不匹配“Aclasv”的长度,因为它很可能包含一些不可打印的/特殊字符(在其他注释中指向null是准确的)。 请查看此代码:

class A {
    private $v = 1;
}

$obja = new A;

var_dump($obja);
// object(A)#1 (1) { ["v:private"]=> int(1) }

$x = serialize( $obja );
var_dump($x);
// note that this string is 27 chars long but only 25 are printed!
// string(27) "O:1:"A":1:{s:4:"Av";i:1;}"

var_dump(unserialize($x));
// object(A)#2 (1) { ["v:private"]=> int(1) }

// proof it is not the same:
var_dump(unserialize('O:1:"A":1:{s:4:"Av";i:1;}'));
// bool(false)