2
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しかし、誰かが中括弧を開いた直後に何であるかを教えてください。

4

2 に答える 2

1

{s:8:"Aclasv",文字列、長さ8です。

1秒のドキュメントを探しています。

更新: ドキュメントが見つからないようです。たぶん私はcorrespをリンクすることを検討します。PHPのソースコード...私も興味があります。リバースエンジニアリングを行い、それを理解する方が簡単かもしれません。

ベストリンク これはかなりクールです、コードには完全なパーサーがあります:https ://github.com/ktomk/Serialized

Serializedは、シリアル化されたデータを正規化された表現(半構造化データまたはS式)に解析できるクラスのセットです。

于 2013-02-05T20:39:53.527 に答える
-1

まず第一に、この質問は特別な意味を持ちません:

  • serialize は、unserialize のみで使用できる値の格納可能な表現を生成します!
  • その出力は「標準化」されていません。JSON ではありません。あるバージョンの PHP で何かをシリアライズし、別のバージョンで unserialize() しようとしてもうまくいくとは限りません。
  • それが生成する文字を理解し、解読しようとしても無意味です。

それでも知りたい場合:

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)
于 2013-02-05T21:07:15.207 に答える