Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как целиком сериализовать объект?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: не могу реализовать Serializable
Быколай
Отправлено: 07 Августа, 2013 - 22:08:29
Post Id



Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Добрый день.
Реализую стандартный интерфейс Serializable:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class obj implements Serializable{
  4.         protected $_id;
  5.         public $var = NULL;
  6.         public function serialize(){
  7.                 if(is_null($this->_id)){
  8.                         $this->_id = time();
  9.                 }
  10.                 return serialize($this);
  11.         }
  12.         public function unserialize($serialized){
  13.                 return unserialize($serialized);
  14.         }
  15. }
  16.  
  17. $obj = new obj();
  18. $obj->var = 'value';
  19. $ser = serialize($obj);
  20. var_dump($ser); // string(18) "C:3:"obj":4:{r:1;}"
  21.  

В документации приведён пример, в котором метод возвращает 1 сериализованное свойство. Собственно хотелось бы упаковывать объект целиком со всеми полями, и я, признаться обескуражен подобным поведением. Буду рад объяснениям почему так происходит и возможно ли данный интерфейс задействовать для сериализации всего объекта.
 
 Top
DlTA
Отправлено: 07 Августа, 2013 - 23:22:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




убери нафиг этот метод из класса, и будет серелизоваться все

этот метод предназначен для случаев когда нельзя все серелизовать, например при работе с базой, или открытием файлов, что при следующей сессии имеющиеся идентификаторы будут уже не валидны, и в методе унсерелизации их открываешь заново.
 
 Top
caballero
Отправлено: 07 Августа, 2013 - 23:37:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Реализую стандартный интерфейс Serializable:

нафига. Объекты и так отлично сериализуется


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DelphinPRO
Отправлено: 07 Августа, 2013 - 23:41:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




PHP:
скопировать код в буфер обмена
  1. class obj implements Serializable{
  2.         protected $_id;
  3.         public $var = NULL;
  4.  
  5.         public function serialize(){
  6.                 return serialize(array(
  7.                     '_id' => $this->_id,
  8.                     'var' => $this->var
  9.                 ));
  10.         }
  11.  
  12.         public function unserialize($serialized){
  13.                 $data = unserialize($serialized);
  14.                 foreach ($data as $k => $v) {
  15.                     $this->$k = $v;
  16.                 }
  17.         }
  18. }
  19.  
  20. $obj = new obj();
  21. $obj->var = 'value';
  22. $ser = serialize($obj);
  23.  
  24. var_dump($ser);


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 08 Августа, 2013 - 00:05:37
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




DelphinPRO
зачем потакать глупым идеям


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DelphinPRO
Отправлено: 08 Августа, 2013 - 09:07:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Если чел собрался полностью сериализовать таким образом объект - да, глупо. Если сериализовать нужно выборочно, и некоторые свойства устанавливать по-умолчанию, или инициализировать что0то - нормально. Я предположил, что человек задал вопрос в целях обучения и показал ему ощий код для сериализации нескольких полей объекта.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 08 Августа, 2013 - 09:34:12
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




для сериализации только выбраных свойст есть метод __sleep()

а инициализирования после сериализаци быть не должно - объект должен быть восстановлен как есть.

в 99.9% случаев сериализация ничего этого не требует и никакого интерфейса тоже.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Быколай
Отправлено: 08 Августа, 2013 - 09:39:35
Post Id



Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




В моём случае задача такая: нужно установить и проверить некоторые свойства объекта перед сохранением. DelphinPRO, спасибо за наводку. Без цикла решил обойтись так:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function serialize(){
  3.         if(is_null($this->_id)){
  4.                 $this->_id = time();
  5.         }              
  6.         return serialize(get_object_vars($this));
  7. }
  8.  
 
 Top
caballero
Отправлено: 08 Августа, 2013 - 09:57:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




свойства объекта инициализируются в конструкторе

для сериализации это не имеет значения - объект будет восстановлен как был. зачем сваливать в кучу бизнес логику и сериализацию.

во вторых для таких вещей предназначем метод __sleep()
ну или __weakup

DelphinPRO
то о чем я говорил - теперь он будет тупо быдлокодить
не стоит новичкам показывать то что они не смогут использовать по уму


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DelphinPRO
Отправлено: 08 Августа, 2013 - 10:50:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




ну в общем-то да, все верно.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB