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]