Про сериализацию в пхп

Иногда бывает так что длина сериализованных данных не безразлична. Например, когда надо сохранить много объектов, но не хочется терять удобство всяких там сеттеров и геттеров сохраняя просто в 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