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
Форумы портала PHP.SU :: Версия для печати :: Как целиком сериализовать объект?
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Как целиком сериализовать объект?

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

1. Быколай - 07 Августа, 2013 - 22:08:29 - перейти к сообщению
Добрый день.
Реализую стандартный интерфейс 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 сериализованное свойство. Собственно хотелось бы упаковывать объект целиком со всеми полями, и я, признаться обескуражен подобным поведением. Буду рад объяснениям почему так происходит и возможно ли данный интерфейс задействовать для сериализации всего объекта.
2. DlTA - 07 Августа, 2013 - 23:22:14 - перейти к сообщению
убери нафиг этот метод из класса, и будет серелизоваться все

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

нафига. Объекты и так отлично сериализуется
4. DelphinPRO - 07 Августа, 2013 - 23:41:00 - перейти к сообщению
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);
5. caballero - 08 Августа, 2013 - 00:05:37 - перейти к сообщению
DelphinPRO
зачем потакать глупым идеям
6. DelphinPRO - 08 Августа, 2013 - 09:07:55 - перейти к сообщению
Если чел собрался полностью сериализовать таким образом объект - да, глупо. Если сериализовать нужно выборочно, и некоторые свойства устанавливать по-умолчанию, или инициализировать что0то - нормально. Я предположил, что человек задал вопрос в целях обучения и показал ему ощий код для сериализации нескольких полей объекта.
7. caballero - 08 Августа, 2013 - 09:34:12 - перейти к сообщению
для сериализации только выбраных свойст есть метод __sleep()

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

в 99.9% случаев сериализация ничего этого не требует и никакого интерфейса тоже.
8. Быколай - 08 Августа, 2013 - 09:39:35 - перейти к сообщению
В моём случае задача такая: нужно установить и проверить некоторые свойства объекта перед сохранением. 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.  
9. caballero - 08 Августа, 2013 - 09:57:29 - перейти к сообщению
свойства объекта инициализируются в конструкторе

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

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

DelphinPRO
то о чем я говорил - теперь он будет тупо быдлокодить
не стоит новичкам показывать то что они не смогут использовать по уму
10. DelphinPRO - 08 Августа, 2013 - 10:50:47 - перейти к сообщению
ну в общем-то да, все верно.

 

Powered by ExBB FM 1.0 RC1