Edit report at http://bugs.php.net/bug.php?id=52604&edit=1

 ID:                 52604
 Updated by:         m...@php.net
 Reported by:        zerspam at mail dot ru
 Summary:            Serialization of objects with __sleep() and fatal
                     error
-Status:             Bogus
+Status:             Re-Opened
 Type:               Bug
 Package:            Session related
 Operating System:   irrelevant
 PHP Version:        Irrelevant
 Block user comment: N

 New Comment:

Tony, if your argument would be valid, there wouldn't be anything in the
serssion at all, sould it?


Previous Comments:
------------------------------------------------------------------------
[2010-10-12 14:44:22] zerspam at mail dot ru

Uhm, in any case: wherther it is a error or not - I expected php does
not broke my data. And I cannot get how your sample related to mine.



With my code you can see that php stores the data it should not store.
And it is a error.

------------------------------------------------------------------------
[2010-10-12 14:24:52] tony2...@php.net

>However if your class implements Serializable everything works as 

>expected when there is a fatal error.



Not true.

See this example:

---------

set_error_handler('my_error_handler');                                  
       

session_start();                                                        
       $a->b();                                                         
              class myclass implements Serializable                     
                                                                  

{                                                                       
           private $a= 1;                          

    private $b = 2;



  public function serialize()

{                                                                       
               var_dump("serialize");               

        return serialize(array('a'));

}                                                                       
           public function unserialize($data)                           
                                  {                                     
                                                
var_dump("unserialize");

        return unserialize($data);

}                                                                       
                                                

}                                                                       
       



function my_error_handler($code, $error, $file = NULL, $line = NULL)    
                                                    

{                                                                       
           throw new ErrorException($error, $code, 0, $file, $line);

}                                                                       
       

$obj = new myclass();                                   

$_SESSION['obj'] = $obj;

---------



Whether your class implements Serializable or not, serializers are
called on _request shutdown_ which never happens in case of fatal error,
because fatal error means BOOM!, exit.



And to be honest, I don't see anything wrong here.

Your script FAILED with a fatal error, did you expect PHP to ignore it
an go on running?

------------------------------------------------------------------------
[2010-09-14 04:43:08] isaiah dot derosewilson at kohanaphp dot com

I also have this same problem. I've tested both php 5.2.12 and 5.3.3 and
neither of them correctly serialize the object when there is a fatal
error - the whole object gets serialized when there is a fatal error
instead of just the properties in __sleep(). However if your class
implements Serializable everything works as expected when there is a
fatal error.

------------------------------------------------------------------------
[2010-09-05 13:32:43] zerspam at mail dot ru

Well, 3 weeks left and even no comments from dev team?

------------------------------------------------------------------------
[2010-08-14 09:40:26] zerspam at mail dot ru

Description:
------------
Seems like __sleep() does not being invoked when fatal error was risen.

Test script:
---------------
        set_error_handler('my_error_handler');



        session_start();



        $obj = new myclass();



        $_SESSION['obj'] = $obj;



        $a->b();



        class myclass

        {

                private $a = 1;

                private $b = 2;

                

                public function __sleep()

                {

                        return array('a');

                }

        }



        function my_error_handler($code, $error, $file = NULL, $line = NULL)

        {

                throw new ErrorException($error, $code, 0, $file, $line);

        }

Expected result:
----------------
Object with only 'a' property in session file

Actual result:
--------------
Object with 'a' and 'b' properties in session file


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52604&edit=1

Reply via email to