Thanks for changing the top posting. :) About the solution, I like the way HHVM solves that. It is also more consistent with the case where you add the invalid value as string on the __sleep (ie, on http://3v4l.org/kupOg I changed the 1 from integer to string). If you return "N;" is hard to detected if you did serialize(null) or if it is an error.
Should I try to solve like HHVM for the consistency with different engine and when the invalid attribute is a string? On Thu, Feb 5, 2015 at 10:51 AM, Rowan Collins <rowan.coll...@gmail.com> wrote: > > On Thu, Feb 5, 2015 at 9:57 AM, Rowan Collins <rowan.coll...@gmail.com >> <mailto:rowan.coll...@gmail.com>> wrote: >> >> Playing around with existing behaviour, if you return something >> other than an array, you get a Notice and a serialized null ('N;') >> - e.g. http://3v4l.org/rm9rs >> >> I think it would be reasonable for the same to happen if the array >> contains something other than a string, particularly given that >> the message would still describe the fix quite readily ( "__sleep >> should return an array only containing the names of >> instance-variables to serialize"). >> >> Personally, I'd have made this a Warning rather than a Notice, >> since it's clearly discarding data, but it should be consistent >> either way. >> >> > Juan Basso wrote on 05/02/2015 15:20: > >> Rowan, >> >> It is happening and giving the same message, but the problem is the >> generate value is corrupted because it generates N; without the key. Ie, >> when you have a valid field and an invalid field it generates >> O:1:"C":2:{s:1:"a";b:1;N;} (note that "a" is the property name, 1 is the >> boolean value and after that it is just null without the key, causing the >> unserialize to not be able to parse it). >> >> If you try to unserialize it gives you the notice "unserialize(): Error >> at offset 25 of 26 bytes in XXX". >> > > Yes, I understand the problem. What I'm saying is that if you return, say, > a string, the result is a validly serialized Null *for the whole object*. > > So: > class A { public function __sleep() { return 'bad value'; } } > var_dump( serialize(new A) ); > // Result: string(2) "N;" > > I'm suggesting the same behaviour for the currently broken case, so: > > class B { public function __sleep() { return ['a', 42]; } } > var_dump( serialize(new B) ); > // Current PHP, invalid: string(24) "O:1:"B":2:{s:1:"a";N;N;}" > // Suggested, consistent with other error cases: string(2) "N;" > > Interestingly, HHVM generates string(29) "O:1:"B":2:{s:1:"a";N;i:42;N;}" > and will convert the integer key to a string when it is *unserialized*. > Adopting this as standard would be another option, I guess. See > http://3v4l.org/S8lRA > > PS I fixed your top posting, because I know people don't like it. :) > > > Regards, > -- > Rowan Collins > [IMSoP] >