[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: глюки serialize и __sleep
moskitos80
Люди, кто нибудь может ответить, что происходит в php 5.3.1 с функцией serialize.
Так то она вроде нормально работает, но как только я перегружаю в объекте, подлежащем сериализации - метод __sleep(), то функция творит следующее: Она значения превращает в ключи и все ключи становятся с пустыми значениями вот пример вывода с отладочной инфой:

Дамп исходного объекта:

User Object
(
[name] => UserName
[password] => UserPassword
[refferer] => /index.php
[time] => Mon 03/01/10
)



Вывод строки после сериализации исходного объекта при перегрузке в этом объекте, метода __sleep():
O:4:"User":4:{s:8:"UserName";N;s:0:"";R:2;s:10:"/index.php";R:2;s:12:"Mon 03/01/10";R:2;}

Дамп десериализованного глючного mad.gif объекта:

User Object
(
[name] =>
[password] =>
[refferer] =>
[time] =>
[UserName] =>
[] =>
[/index.php] =>
[Mon 03/01/10] =>
)

А если не перегружать __sleep(), то всё работает нормально:

Дамп исходного объекта:

User Object
(
[name] => UserName
[password] => UserPassword
[refferer] => /index.php
[time] => Mon 03/01/10
)



Вывод строки после сериализации исходного объекта при перегрузке в объекте, метода __sleep():
O:4:"User":4:{s:4:"name";s:8:"UserName";s:8:"password";s:12:"UserPassword";s:8:"refferer";s:10:"/index.php";s:4:"time";s:12:"Mon 03/01/10";}

Дамп десериализованного нормального smile.gif объекта:

User Object
(
[name] => UserName
[password] => UserPassword
[refferer] => /index.php
[time] => Mon 03/01/10
)

Вот пример кода класса:
PHP
<?php
final class User
{
    public 
$name;
    public 
$password;
    public 
$refferer;
    public 
$time;
    
    function 
__construct($name,$password)
    {
        
$this->name $name;
        
$this->password $password;
        
$this->refferer $_SERVER['PHP_SELF'];
        
$this->time strftime('%a %x',time());
    }
    
    public function 
__sleep()
    {
        
$this->password '';//Сбрасывание пароля
        
return $this;
    }
    
    public function 
__wakeup()
    {
        
$this->time strftime('%a %x',time());//Сбрасывание времени
    
}
}


Вот код основного файла:

PHP
<?php

include 'class.php';

function 
dump($obj)
{
    echo 
'<pre>';
    
print_r($obj);
    echo 
'</pre>';
 }
 
$user = new User('UserName','UserPassword'); 

dump($user);

$temp serialize($user);
echo 
$temp;

$obj unserialize($temp);
dump($obj);



Кто нибудь вкурсе, что это за "приколы"? И как теперь жить после этого? blink.gif



Спустя 32 минуты, 34 секунды (1.03.2010 - 15:57) glock18 написал(а):
Цитата
serialize() checks if your class has a function with the magic name __sleep. If so, that function is being run prior to any serialization. It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized. If the method doesn't return anything then NULL is serialized and E_NOTICE is issued.


возвращать нужно массив имен свойств, которые нужно сохранять.

Спустя 19 минут, 12 секунд (1.03.2010 - 16:17) moskitos80 написал(а):
Цитата (glock18 @ 1.03.2010 - 12:57)
Цитата
serialize() checks if your class has a function with the magic name __sleep. If so, that function is being run prior to any serialization. It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized. If the method doesn't return anything then NULL is serialized and E_NOTICE is issued.


возвращать нужно массив имен свойств, которые нужно сохранять.

Отлично - сделал __sleep() - таким образом:

PHP
public function __sleep()
    {
        
$this->password '';//Сбрасывание пароля
        
$temp = array(name,password,refferer,time);//Имена свойств.
        
return $temp;
    }


-Жизнь вновь обретает смысл. Спасибо!
- Заработал! А в книге блин просто:
PHP
return $this;
Кто б мог подумать! mad.gif Сколько ещё подобного ждёт на пути просвящения?(Вопрос - риторич.) huh.gif

Спустя 6 минут, 32 секунды (1.03.2010 - 16:23) glock18 написал(а):
moskitos80
пароль, насколько я вижу не имеет смысла сохранять

возвращай массив или без него, или чтобы не хардкодить имена используй get_object_vars()

Спустя 46 минут, 40 секунд (1.03.2010 - 17:10) moskitos80 написал(а):
Цитата (glock18 @ 1.03.2010 - 13:23)
moskitos80
пароль, насколько я вижу не имеет смысла сохранять

возвращай массив или без него, или чтобы не хардкодить имена используй get_object_vars()

PHP
public function __sleep()
    {
        
$this->password '';//Сбрасывание пароля
        
return get_object_vars($this);
    }

-Тоже, кстати не канает. Блин!
- Просто имена переменных прокатывает, а
PHP
get_object_vars($this);
- уже нет.

Цитата
пароль, насколько я вижу не имеет смысла сохранять

возвращай массив или без него,


Да дело то собственно не в пароле, а в "кривости" - либо моих рук, либо метода, и в возможности сохранять состояние и управлять сохранением объекта.
В инглише я не особ силён, поэтому вот обращаюсь за помощью сюда.

Спустя 1 час, 1 минута, 2 секунды (1.03.2010 - 18:11) glock18 написал(а):
moskitos80
не так пробуешь, значит smile.gif Если не ошибаюсь, get_object_vars возвращает ассоциативный массив, тогда тебе надо брать
return array_keys(get_object_vars($this));

Спустя 37 минут, 51 секунда (1.03.2010 - 18:49) moskitos80 написал(а):
Цитата (glock18 @ 1.03.2010 - 15:11)
moskitos80
не так пробуешь, значит smile.gif Если не ошибаюсь, get_object_vars возвращает ассоциативный массив, тогда тебе надо брать
return array_keys(get_object_vars($this));

Да эта конструкция работает как надо.
-Приношу извинения Энди Гутмансу и Зиву Сураски.
-glock18 - респект и СПАСИБО.

ЗЫ:
Пошёл учить мат часть и выпрямлять руки... smile.gif


_____________
Сложное - просто. Простое сложно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.