Разделы публикаций

 
     
 

Сериализация объектов и автозагрузка

nectarin
228
    nectarin nectarin
Сергей NectarIn Новиков
Специализации: 1

Данный момент частично описан в официальной документации PHP, однако, на практике для большинства разработчиков он становится неприятной неожиданностью.

При сериализации объекта PHP сохраняет в итоговой строке имя класса и значения свойств объекта. Методы объекта и данные о родительских классах или имплементируемых интерфейсах не сохраняются. Следовательно, необходимый класс должен быть определён до того, как объект будет обратно десериализован из строки. В большинстве случаев все классы системы не имеет смысла подключать при каждом запросе. А если класс с нужным именем не был определён, PHP инстанцирует объект класса __PHP_Incomplete_Class_Name и определяет в нём свойства, сохранённые при сериализации объекта. Само собой, нормальная работа с таким объектом невозможна.
Положение исправляет автозагрузка классов, но одного наличия определённой функции __autoload() недостаточно, чтобы интерпретатор попытался автоматически подключить нужный класс. Для этого должна быть установлена директива конфигурации unserialize_callback_func, в которой указывается имя метода автозагрузки. Устанавливать значение этой директивы можно в любом месте, поэтому самое простое и правильное — на этапе инициализации приложения присвоить этой директиве значение __autoload. При этом нужно помнить, что если функция автозагрузки указана, но не определена, при вызове функции unserialize() возникнет warning.

Проблема становится ещё актуальнее, если вспомнить, что сессии для хранения данных используют именно сериализацию. Десериализация производится при вызове функции session_start(), которая часто вызывается в самом начале работы приложения. Ещё хуже, если сессия стартует автоматически (с использованием директивы session.auto_start). В этом случае не помогает и использование директивы auto_prepend_file, то есть нет возможности стандартными средствами определить функцию автозагрузки до старта сессии.
В конечном итоге получается, что для нормального сохранения объектов в сессии нужно обязательное выполнение следующих условий:


  1. Автоматический запуск сессий отключён.

  2. Функция __autoload() определяется до момента старта сессии.

  3. До момента старта сессии выполняется команда ini_set('unserialize_callback_func', '__autoload').


Установку директивы unserialize_callback_func лучше размещать сразу после определения функции автозагрузки, чтобы сгруппировать эти важные элементы вместе.

1
Просмотров: 2469
     

Новости inPHP.org Новости inPHP.org
30.12.2011   С наступающим Новым Годом!
Команда inPHP.org поздравляет всех посетителей сайта проекта с наступающим Новым Годом! Вероятно, многие участники проекта заметили некоторое затишье в уходящем году. Поверьте, в следующем всё будет несколько иначе!
31.12.2010   С Новым Годом!
Уважаемые коллеги, коллектив проекта inphp.org искренне поздравляет вас с наступающим Новым Годом!
27.05.2010   Технические работы.
По техническим причинам возможны кратковременные перебои в работе сайта проекта в период с 27.05.2010 по 1.06.2010.
02.03.2010   Доступ участников к разработке тестирований.
В тестовом режиме запущен функционал, позволяющий участникам проекта разрабатывать собственные тестирования. Разработанные сообществом тестирования не имеют ограничений официальной аккредитации и в любое время доступны любому участнику.
 
Содействуют развитию Содействуют развитию
Участники проекта Участники проекта
monya
20
    monya monya

Специализации: 0
ruscode
80
    ruscode ruscode

Специализации: 0
rs507n2
20
    rs507n2 rs507n2

Специализации: 0
nikitozzz
20
    nikitozzz nikitozzz

Специализации: 0
lettex
80
    lettex lettex
Константин
Специализации: 0
 
Статистика проекта Статистика проекта
Всего пользователей: 3648
Из них аккредитовано: 1468
Были сегодня: 2

УровеньПользователи
7742%
62376,5%
52075,7%
41945,3%
336510%
2401,1%
13509,6%
отсутствует218059,8%