Иногда бывает так что длина сериализованных данных не безразлична. Например, когда надо сохранить много объектов, но не хочется терять удобство всяких там сеттеров и геттеров сохраняя просто в stdClass или массив. И уж тем более не хочется мутить костыли с сохранением в массив, сериализацией, а потом обратным восстановлением и проходом по всем ключам массива с воссозданием нужного объекта. Но пхп не перестаёт удивлять :(.
Сериализуем объект с публичными переменными:
class C_PUBLIC { public $var1 = 1; public $var2 = 2; public $var3 = 3; } var_dump(serialize(new C_PUBLIC())); // string(64) "O:8:"C_PUBLIC":3:{s:4:"var1";i:1;s:4:"var2";i:2;s:4:"var3";i:3;}"
64 символа, по сути тот же массив, только что имя класса указывается. Ок.
Сериализуем с защищёнными переменными:
class C_PROTECTED { protected $var1 = 1; protected $var2 = 2; protected $var3 = 3; } var_dump(serialize(new C_PROTECTED())); // string(77) "O:11:"C_PROTECTED":3:{s:7:"*var1";i:1;s:7:"*var2";i:2;s:7:"*var3";i:3;}"
77 символов. Добавилось три звёздочки (по одной на переменную) и изменилось имя класса. Ну и почему-то внутри уже s:7 а не s:4. Ну да ладно.
Сериализуем с приватными переменными:
class C_PRIVATE { private $var1 = 1; private $var2 = 2; private $var3 = 3; } var_dump(serialize(new C_PRIVATE())); //string(101) "O:9:"C_PRIVATE":3:{s:15:"C_PRIVATEvar1";i:1;s:15:"C_PRIVATEvar2";i:2;s:15:"C_PRIVATEvar3";i:3;}"
101 символ. LOLWUT?
Очень удивился когда вместо 193 символов с protected я получил 432 с private. Неожиданно. Поленились ребята немного доработать сериализацию.
2013.01.28 20:38