Исходная ссылка: http://hi.baidu.com/lostdays/blog/item/8d76c300ec4e3c15738b65fa.html
Общий каталог
Что, Почему, Как
Что
Почему
Как
синтаксис сериализации PHP
Пример сериализации PHP
Сериализация в JSON в JavaScript — с использованием json2.js
Сериализация в JSON в JavaScript — с использованием
PHP-прототипа.js с функцией JSON
json_decode.
функция json_encode
пример функции json_decode
Пример использования функции json_encode
дает истинное
объяснение знаний
JavaScript-часть внешнего интерфейса
Серверная часть PHP
Что, почему, как
Что
Хорошо, дорогие друзья, давайте начнем знакомство с этой новой концепцией. Возможно, никто раньше не обращал особого внимания на тему сериализации. На самом деле, она возникла с того дня, когда я случайно пролистал руководство по PHP. и нашел эту сериализацию. После этого мне стало скучно, и я сделал плагин для WordPress. В это время я использовал сериализацию и обнаружил, что это действительно очень удобно в определенных ситуациях.
Давайте сначала объясним сериализацию. Проще говоря, сериализация — это процесс преобразования переменных в поток байтов. Введение сериализации эффективно решает проблему хранения и передачи объектов. Например, я создал объект в JavaScript и теперь хочу сохранить его в серверной базе данных. Итак, как мне с ним работать, на этот раз с сериализацией? объектов часто используется. При сериализации JavaScript мы должны упомянуть JSON (нотация объектов JavaScript) — это облегченный формат обмена данными. Людям легко читать и писать, а машинам легко анализировать и генерировать. Он основан на языке программирования JavaScript, подмножестве стандарта ECMA-262, 3-е издание — декабрь 1999 г. JSON использует полностью независимый от языка текстовый формат, но также использует соглашения, аналогичные семейству языков C (включая C, C++, C#, Java, JavaScript, Perl, Python и т. д.). Эти свойства делают JSON идеальным языком обмена данными.
Люди обычно сравнивают JSON и XML. Оба являются средством выравнивания объектов (мы объясним это «сглаживание» позже). XML характеризуется строгой структурой, а JSON отличается простотой и легкостью чтения. программу для анализа, поскольку она может легко преобразовать объект в форму потока символов, например следующий код:
Код:
{"type":"human","name":"hanguofeng","age": 22 }
— это выражение JSON, которое сохраняет объект. Как нам восстановить его в объект? Это очень просто:
Код:
var Animal_str = '{"type":"human","name":"hanguofeng","age":22}';
var Animal2=eval('(' + Animal_str + ')');
Мы используем функцию оценки JavaScript для работы с выражением JSON и возврата значения для получения объекта. Думаю, вы уже поняли. Как и я, я. восхищаюсь мышлением создателя формата JSON. Изначально я собирался поговорить о сериализации, но «случайно» упомянул JSON и так много говорил об этом. Ха-ха, я отклонился от темы? Нет, сериализация PHP очень похожа на JSON. Выражение сериализации PHP выглядит следующим образом:
Код:
a:3:{s:4:"тип";s:5:"человек";s:4:"имя";s:10:"хангофэн";s:3:"возраст";s:2:" 20";}
Его структура чем-то похожа на JSON. Фактически это выражение представляет собой сериализованный результат следующего массива:
Код:
$животное =
множество
(
"тип" => "человек",
"имя" => "Ханьгофэн",
"возраст" => "20"
);
Хорошо, приведенное выше введение предназначено только для того, чтобы дать вам примерное представление о том, что такое сериализация и JSON. Здесь не нужно слишком запутываться в коде. Мы объясним это подробно позже. используйте сериализацию.
Почему
сериализация впервые появилась как удобство передачи данных. Когда я задал вопрос в начале этой статьи, я создал объект в JavaScript и теперь хочу сохранить этот объект в базе данных на стороне сервера. Как мне это сделать? Фактически, речь идет о том, «как отправить объект из браузера на сервер». Во время процесса передачи мы знаем, что на самом деле может быть передан только поток символов. Поток символов является одномерным (плоским). , но много объектов. Но он многомерен. Если передаваемый объект представляет собой строку, это очень просто. Мы можем напрямую использовать его в качестве передаваемого содержимого. Если передаваемый объект представляет собой массив или другую структуру, мы. нужно использовать иероглифы. Чтобы описать его, например, по телефону, если я спрошу, как тебя зовут, ты скажешь, что тебя зовут Чжан Сан или Ли Си, а если я спрошу, как ты выглядишь. , вам нужно использовать слова. Мне описали, что среда, через которую мы передаем данные, часто такая же, как эта телефонная линия, которая может передавать только потоки символов, а процесс, с помощью которого мы описываем объекты, на самом деле является процессом сериализации. .
Кроме того, сериализацию можно использовать и для постоянного хранения объектов. Возможно, вы, как и я, когда-то задумывались о хранении объекта в определенном поле базы данных. Теперь мы можем сделать это очень просто, и ваше поле базы данных не требуется. чтобы установить специальный формат, просто установите для него значение varchar (конечно, если объект большой, вам может потребоваться установить для него текст).
Как
синтаксис сериализации PHP
Хорошо, я думаю, вы поняли вопросы «Что и почему». В конце этого раздела мы поговорим о чем-то более теоретическом, а именно о том, как использовать PHP для сериализации и десериализации данных, как сериализовать JavaScript. объекты (то есть изменить их на формат JSON) и как их десериализовать Наконец, как установить связь между сериализацией JSON и PHP.
PHP предоставляет нам две функции для операций сериализации и десериализации. Эти две функции: сериализация() и unserialize(). Они описаны ниже:
сериализация()
(PHP 4, PHP 5, PECL axis2)
.:0.1.0-0.1.1)
сериализация — Получить сохраняемую
строку
значения представлениясериализовать (смешанное $value)
Получите сохраняемое значение представления. Эта функция используется для хранения или передачи значений и структур переменных PHP без потерь.
Если вам нужно преобразовать сериализованное значение обратно в переменную PHP, вы можете использовать функцию unserialize().
Значение
параметра
То есть выражение сериализуется. Serialize() обрабатывает все типы, кроме указателей ресурсов, и вы даже можете сериализовать массив, содержащий элементы, указывающие на себя. Массивы или объекты, которые вы сериализуете и которые содержат указатели циклов, по-прежнему будут храниться, но другие указатели будут потеряны.
При сериализации объекта PHP пытается сначала вызвать его функцию-член __sleep(). Это позволит выполнять такие действия, как окончательная очистка перед сериализацией объекта. Аналогично, когда объект восстанавливается с помощью функции unserialize(), будет вызвана функция-член __wakeup().
Возвращаемое значение
возвращает строку, содержащую выражение потока байтов объекта, который может храниться где угодно.
unserialize()
(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)
Получить
значение переменной PHP из сохраненного выражения,
смешанного unserialize (строка $str)
unserialize() принимает сериализованную переменную простого типа и преобразует ее обратно в значение переменной PHP.
Параметр
str
сериализованная строка Если десериализованная переменная является объектом, после успешного восстановления структуры объекта PHP автоматически попытается выполнить функцию-член __wakeup() объекта (если она существует).
Директива unserialize_callback_func: вы можете настроить функцию обратного вызова, которая будет выполняться во время этого процесса, если во время десериализации должен быть создан экземпляр неопределенного класса (чтобы избежать получения неполного объекта «__PHP_Incomplete_Class»). Вы можете использовать php.ini, ini_set() или .htaccess для определения «unserialize_callback_func». Он вызывается при создании экземпляра неопределенного класса. Чтобы отключить эту функцию, просто установите ее пустой.
Возвращаемое значение
возвращает преобразованное значение, которое может быть логической переменной, вещественным числом, числом с плавающей запятой, строкой, массивом или объектом.
Если входящую строку невозможно десериализовать, возвращается FALSE и выдается ошибка NOTICE.
(Вышеупомянутое переведено из руководства по PHP)
Сериализация и десериализация
массиваэкземпляров сериализации PHP
Хорошо, давайте изучим это на примере. Сначала создайте файл sample1.php. В этом файле мы используем следующий оператор. массив:
Код:
<?php
$животное =
множество
(
"тип" => "человек",
"имя" => "Ханьгофэн",
"возраст" => "20"
);
?>
Чтобы проверить значение этого массива, вы можете использовать функцию print_r() для вывода массива. Результаты вывода следующие:
Код:
Множество
(
[тип] => человек
[имя] => Хангофэн
[возраст] => 20
)
Затем давайте сериализуем его. Код сериализации следующий:
Код:
<?php
$животное =
множество
(
"тип" => "человек",
"имя" => "Ханьгофэн",
"возраст" => "20"
);
$animal_ser=serialize($animal);
эхо ($animal_ser);
?>
Здесь мы сериализуем массив $animal, сохраняем возвращенную сериализованную строку в переменной $animal_ser и выводим ее. Результат:
Код:
a:3:{s:4:"тип";s:5:"человек";s:4:"имя";s:10:"хангофэн";s:3:"возраст";s:2:" 20";}
Давайте просто разберем эту строку:
a:3 указывает, что это объект массива (a), который имеет три встроенных объекта (3).
Часть внутри фигурных скобок представляет собой список выражений объектов, разделенных запятыми. Если взять в качестве примера s:4:"type", то она представляет строку(и) длиной 4 цифры (4) и значением "type". , то есть ключ первого элемента хеш-массива.
В следующих частях мы не будем вдаваться в подробности. Вы можете попробовать сериализовать различные объекты самостоятельно и посмотреть, как создается сериализованная строка.
Давайте посмотрим на десериализацию массива, то есть восстановление сериализованной строки, которую мы сгенерировали выше, в массив. Код выглядит следующим образом:
Код:
<?php
$animal_ser='a:3:{s:4:"тип";s:5:"человек";s:4:"имя";s:10:"hanguofeng";s:3:"возраст";s :2:"20";}';
$animal = unserialize($animal_ser);
print_r ($ животное);
?>
В первой строке мы предполагаем, что значение $animal_ser — это сериализованная строка, полученная выше. Во второй строке строка восстанавливается в исходный массив и присваивается $animal. Наконец, при этом выводится массив $animal. time Вывод такой же, как исходный вывод массива в начале этого раздела, а именно:
код:
Множество
(
[тип] => человек
[имя] => Хангофэн
[возраст] => 20
)
На этом мы завершили десериализацию массива.
Расширение знаний — Сериализация и десериализация пользовательских объектов
Сериализация массивов — это базовая операция. Однако в реальном программировании мы часто можем сериализовать другие типы переменных, например сериализуются пользовательские объекты. Вот класс A, написанный нами (сохраненный в classa). .inc):
Код:
<?php
класс А {
вар $один = 1;
функция show_one() {
эхо $this->one;
}
}
?>
Мы создаем экземпляр класса и сериализуем его в следующем коде:
Код:
<?php
include("classa.inc");
$а=новый А;
эхо (сериализовать ($ а));
?>
Содержимое вывода в это время:
код:
О:1:"А":1:{s:3:"один";i:1;}
В целом, эта сериализованная строка выводит текущее состояние объекта, то есть значение i равно 1. Давайте разберем детали по порядку. O:1: поскольку текущая переменная является пользовательским объектом, характеризирующим символом является «O», что означает «Объект». Следующая буква «A» определяет, экземпляром какого класса является переменная, здесь это класс A. Внутри фигурных скобок указаны имена и значения каждого атрибута экземпляра. Затем мы десериализуем его:
Код:
<?php
include("classa.inc");
$s = 'O:1:"A":1:{s:3:"one";i:1;}';
$а = десериализовать($s);
$a->show_one();
?>
В это время выводится «1», то есть вызывается метод show_one() класса A. Вы можете заметить, что хотя сериализованная строка экземпляра не содержит метода класса, мы все равно можем вызвать метод класса после его десериализации. Эта функция поддерживается в PHP4 и более поздних версиях (конечно, вам необходимо включить файл определения класса. classa.inc).
Примечание. Вы можете обратиться к разделу «Справочник по языку» -> «Классы и объекты» -> «Сериализация объектов — объекты в сеансах» руководства по PHP.
Сериализация в JSON в JavaScript — с использованием json2.js
Не существует встроенного метода сериализации объектов непосредственно в JavaScript. Конечно, вы можете написать его самостоятельно, но я все же настоятельно рекомендую вам полениться и использовать готовые компоненты JSON. Официальный сайт www.json.org предоставляет библиотеку кода для JSON-сериализации объектов JavaScript — json2.js, которую вы можете получить отсюда.
После получения файла json2.js вы можете открыть этот файл. Первая часть файла содержит значительное количество комментариев. Если вы достаточно хорошо владеете английским языком, вы можете пропустить этот раздел и просто обратиться к комментариям к файлу. Хорошо, если вы, как программист, видели достаточно букв и хотите увидеть мои китайские иероглифы + буквы, то можете продолжить вниз.
Просто переведите этот комментарий: См. http://www.JSON.org/js.html. Этот файл создает глобальный объект JSON, содержащий два метода:
Код:
JSON.stringify(значение, белый список)
значение любого значения JavaScript, обычно объекта или массива
белый список Необязательный параметр массива, используемый для определения способа сериализации значения объекта. Этот метод генерирует текст JSON из значения JavaScript. При сериализации есть три возможности, основанные на необязательном белом списке параметров:
Если у объекта есть метод toJSON, вызовите этот метод, и возвращаемое значение метода toJSON будет сериализовано.
В противном случае, если необязательный параметр белого списка представляет собой массив, элементы массива будут использоваться для выбора членов объекта для сериализации.
В противном случае, если параметр белого списка не используется, все члены объекта будут сериализованы.
Если значение не имеет представления JSON, например неопределенное или функцию, оно не будет сериализовано. В объектах такие значения будут игнорироваться, а в массивах заменяться нулевыми.
JSON.stringify(unопределенный) вернет неопределенное значение. Дата будет преобразована в указанную дату ISO.
Пример:
код:
var text = JSON.stringify(['e', {pluribus: 'unum'}]);
//текст: '["e",{"pluribus":"unum"}]'
JSON.parse(текст, фильтр)
Этот метод анализирует текст JSON и генерирует компонент или массив, который может вызвать исключение SyntaxError.
Необязательный параметр фильтра — это функция, которая фильтрует и преобразует результаты. Она принимает каждый ключ и значение, а ее возвращаемое значение используется для замены исходного значения. Если он возвращает полученное значение, результат не изменится. Если он возвращает неопределенное значение, участник будет удален.
Пример:
код:
//Разбираем текст и, если ключ содержит строку «дата», преобразуем его значение в дату
myData = JSON.parse(текст, функция (ключ, значение) {
return key.indexOf('date') >= 0 ? новая дата (значение): значение;
});
Приведенное выше вводное руководство дало вам базовое представление о том, как использовать json2.js. Я не буду здесь вдаваться в подробности об этом файле, у меня есть лишь небольшой совет. Если вы хотите просто проанализировать текст JSON, вы можете использовать eval. () Функция. Функция является встроенной функцией JavaScript. Например, для анализа текста JSON, сгенерированного в случае JSON.stringify, вы можете использовать:
код:
var myE = eval('["e",{"pluribus":"unum"}]');
чтобы получить объект myE.
Сериализация в JSON в JavaScript — используйте прототип.js.
Если вы, как и я, любите использовать в своих проектах JavaScript-фреймворки с открытым исходным кодом, то вы можете пропустить использование файла json2.js. Вот, например, это прототип.js. файл можно скачать по адресу http://www.prototypejs.org . Поскольку эта статья не посвящена фреймворку JavaScript, я предполагаю, что вы уже имеете некоторое представление об использовании прототипа.js.
Prototype.js предоставляет метод toJSON для объектов Object. Вы можете использовать метод Object.toJSON() для сериализации объектов, например:
код:
вар кот=
{
имя:"Хеллокитти",
высота:"6 яблок"
}
оповещение(Object.toJSON(кот));
//Появится диалоговое окно с содержимым {"name": "hellokitty", "height": "6 apples"}
Кроме того, в прототипе.js имеется дополнительная поддержка JSON, в основном это анализ содержимого JSON в запросе возврата Ajax в объекте Ajax. На данный момент это не имеет никакого отношения к нашему контенту и больше не будет представлено.
PHP и JSON
Выше мы узнали о методе сериализации объектов в PHP и методе сериализации объектов в JSON в JavaScript. Вы, вероятно, спросите, почему я объединил эти два понятия, ведь их синтаксис на самом деле не совсем одинаковый. в PHP можно десериализовать текст JSON, а также можно сериализовать объекты PHP в JSON вместо текста в стиле PHP. В основном это достигается с помощью двух функций json_decode и json_encode. Следует отметить, что эти две функции поддерживаются только в PHP 5 >= 5.2.0. Если вы хотите написать программу, работающую в среде PHP4, то эти две функции. использовать нельзя.
Синтаксис
функции json_decode
смешанный json_decode (строка $json [, bool $assoc])
Получите текст в кодировке JSON и преобразуйте его в переменный
параметр
PHPjson.
Текст в кодировке JSON
доцент
Если значение TRUE, возвращаемое значение представляет собой ассоциативный массив.
Возвращаемое значение
представляет собой объект, а если необязательный параметр assoc имеет значение TRUE, будет возвращена
строкасинтаксиса
функции json_encode
json_encode (смешанное значение $).
Эта функция возвращает
значение
параметра
выражения JSON значения.
Кодируемое значение может быть параметром любого типа, кроме ресурса. Эта функция работает только в формате кодировки UTF-8.
Возвращает
закодированный текст JSON в случае успеха.
Следующие
два примера основаны на одном из наших сценариев. то есть у нас есть модуль регистрации пользователей, который работает «объектно-ориентированным» образом. В экземпляре функции json_decode мы меняем регистрационную информацию пользователя на атрибут класса на переднем плане, а затем передаем ее на задний план. php (для простоты здесь не используется Ajax). В примере json_encode мы ссылаемся на файл js в файле html, адрес указывает на файл php и выводим объект пользователя в кодировке json в файле php (также для простоты мы напрямую генерируем объект, не получая информацию от базу данных) и вывести в формате html.
Хорошо, давайте сначала посмотрим на интерфейсную страницу json_encode.htm. Эта страница имитирует обычную страницу регистрации. При отправке запускается функция JavaScript, генерируется пользовательский объект и содержимое формы. устанавливается как пользовательский объект, генерирует текст JSON и передает его в фоновый файл json_encode.php в режиме POST. В файле js_encode.php используйте функцию json_decode, чтобы проанализировать текст JSON в объект PHP и вывести его.
Хорошо, давайте сначала посмотрим на файл json_encode.html. Код файла следующий:
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<голова>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>json_decode</title>
<script src="json2.js" type="text/javascript"></script>
<тип сценария="текст/javascript">
функция JSON_test(o){
вар пользователь = {
имя: document.getElementById('txt_name').value,
электронная почта:document.getElementById('txt_email').value,
пароль:document.getElementById('txt_name').значение
}
вар json_string = JSON.stringify(пользователь);
document.getElementById('txt_json').value=json_string;
alert("Нажмите ОК, чтобы отправить форму");
о.submit();
}
</скрипт>
</голова>
<тело>
<form id="form1" name="form1" метод="post" action="json_encode.php" onsubmit="JSON_test(this)">
<label for="txt_name">Имя</label>
<р>
<input type="text" name="txt_name" id="txt_name" />
</p>
<label for="txt_email">Электронная почта</label>
<р>
<input type="text" name="txt_email" id="txt_email" />
</p>
<р>
<label for="txt_password">Пароль</label>
</p>
<р>
<input type="text" name="txt_password" id="txt_password" />
</p>
<р>
<input type="text" name="txt_json" id="txt_json" />
<label for="button"></label>
<input type="submit" name="button" id="button" value="JSON" />
</p>
</форма>
</тело>
</html>
При отправке формы будет запущена функция JavaScript JSON_text(). Эта функция сначала создает пользователя объекта JavaScript, устанавливает для его атрибутов имя, адрес электронной почты и пароль значения соответствующей формы, а затем использует JSON.stringify. метод файла json2.js в Он преобразуется в текст JSON json_string и, наконец, устанавливается скрытое поле (чтобы было понятно, я показываю это скрытое поле в виде текстового поля), значение txt_json равно json_string, и форма отправлена.
Затем перейдите к файлу json_encode.php следующим образом:
Код:
<?php
$json_string = $_POST["txt_json"];
if(ini_get("magic_quotes_gpc")=="1")
{
$json_string=stripslashes($json_string);
}
$user = json_decode($json_string);
эхо var_dump($user);
?>
В этом файле сначала получите значение поля txt_json формы POST в файле json_encode.html, поместите его в переменную $json_string, а затем определите, что если текущая настройка PHP — Magic_quotes_gpc=On, то есть входящие двойные кавычки будет преобразовано, поэтому функция json_decode не сможет его проанализировать, поэтому нам нужно отменить его экранирование. Затем используйте функцию json_decode, чтобы преобразовать текст JSON в объект, сохранить его в переменной $user и, наконец, использовать echo var_dump($user); Конечный результат:
Код:
объект(stdClass)#1 (3) {
["имя"]=>
строка(10) "Ханьгофэн"
["электронная почта"]=>
строка(18) " [email protected] "
["пароль"]=>
строка(10) "Ханьгофэн"
}
экземпляр функции json_encode
по-прежнему состоит из двух частей, а именно json_enode.html и json_encode.php. Форма файла json_decode.html в основном аналогична форме файла json_decode.html, но разница в том, что на этот раз мы хотим получить текст JSON соответствующего пользователя из файла json_encode.php. Давайте посмотрим на этот PHP-файл. сначала:
Код:
<?php
Пользователь класса {
общественное $name="";
общественный $email="";
общественный $пароль="";
};
$myUser = новый пользователь;
$myUser->name="hanguofeng";
$myUser->email=" [email protected] ";
$myUser->password="hanguofeng";
$json_string = json_encode($myUser);
?>
var user = <?php echo($json_string)?>;
Этот файл сначала создает пользователя класса, затем получает экземпляр класса пользователя myUser и устанавливает его имя пользователя, адрес электронной почты и пароль. Затем он использует функцию json_encode для преобразования его в текст JSON, сохраняет его в переменной $json_string и, наконец, использует функцию json_encode. выводит фрагмент кода JavaScript для создания глобальной переменной user в JavaScript.
Далее нам нужно добавить файл json_encode.php в файл json_encode.html и получить различные атрибуты пользовательского объекта следующим образом:
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<голова>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>json_encode</title>
<script src="json_encode.php" type="text/javascript"></script>
</голова>
<тело>
<form id="form1" name="form1" метод="post">
<label for="txt_name">Имя</label>
<р>
<input type="text" name="txt_name" id="txt_name" />
</p>
<label for="txt_email">Электронная почта</label>
<р>
<input type="text" name="txt_email" id="txt_email" />
</p>
<р>
<label for="txt_password">Пароль</label>
</p>
<р>
<input type="text" name="txt_password" id="txt_password" />
</p>
</форма>
<script type="text/javascript" >
document.getElementById('txt_name').value=user.name;
document.getElementById('txt_email').value=user.email;
document.getElementById('txt_password').value=user.password;
</скрипт>
</тело>
</html>
В этом файле вам нужно обратить внимание на два момента. Во-первых, мы представляем файл json_encode.php как файл JavaScript с этим кодом:
Код:
<script src="json_encode.php" type="text/javascript"></script>
Второй момент:
Мы добавляем код JavaScript после кода текстового поля, используем атрибут value текстового поля и устанавливаем его значение равным соответствующему значению пользовательского объекта.