я использую PHP 7.1.12 и я пытаюсь понять функциональность одной из самых важных встроенных функций в PHP serialize()
Я понял это serialize()
используется для генерации хранимого представления значения, которое передается ему.
Я думаю это значит serialize()
преобразует полученное значение в некоторую строку, используя ее внутреннюю функциональность. Правильно ли это мое восприятие serialize()
?
Рассмотрим код ниже:
<?php
$a = [];
$a[] = $a;
echo "\na: ".serialize($a);
$b = [];
$b[] =& $b;
echo "\nb: ".serialize($b);
Выход :
a: a:1:{i:0;a:0:{}}
b: a:1:{i:0;a:1:{i:0;R:2;}}
В выводе не могу понять откуда буквы я, а, р идут на выход. Кроме того, я не могу понять, как этот вывод формируется serialize()
Итак, мой вопрос: Как разработчику PHP, необходимо ли мне понимать вышеприведенный вывод или я должен напрямую использовать этот вывод, не вдаваясь в его детали?
Пожалуйста, направьте меня в этом отношении.
Ниже приводится общее объяснение того, что означают эти символы.
строка
s:size:value;
целое число
i:value;
логический
b:value; (store '1' or '0')
Ноль
N;
массив
a:size:{key definition;value definition;(repeated per element)}
объект
O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}
Нам не обязательно знать, как PHP сериализуется, но если вам интересно, приведенное выше объяснение поможет понять, что в этом есть какая-то логика. Надеюсь, это поможет.
Еще одна особенность формата сериализации в PHP заключается в том, что он будет правильно сохранять ссылки: важной частью здесь является R: 2; элемент. Это означает «ссылка на второе значение.
Поскольку объекты в PHP демонстрируют поведение, похожее на ссылку, сериализация также гарантирует, что один и тот же объект, встречающийся дважды, действительно будет одним и тем же объектом при десериализации:
$b = [];
$b[] =& $b;
echo "\nb: ".serialize($b);
output:b: a:1:{i:0;a:1:{i:0;R:2;}}
Весь массив — это первое значение, первый индекс — это второе значение, так что на это ссылаются.