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