Bug #60560 [Opn->Csd]: SplFixedArray un-/serialize, getSize(), count() return 0, keys are strings
| From: | aharvey@php.net | Date: | Tue, 21 Feb 2012 10:34:50 +0000 |
| Subject: | Bug #60560 [Opn->Csd]: SplFixedArray un-/serialize, getSize(), count() return 0, keys are strings | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-167695@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=60560&edit=1
ID: 60560
Updated by: aharvey@php.net
Reported by: digital1kk at interia dot pl
Summary: SplFixedArray un-/serialize, getSize(), count()
return 0, keys are strings
-Status: Open
+Status: Closed
Type: Bug
Package: SPL related
PHP Version: Irrelevant
-Assigned To:
+Assigned To: aharvey
Block user comment: N
Private report: N
New Comment:
This bug has been fixed in SVN.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
For Windows:
http://windows.php.net/snapshots/
Thank you for the report, and for helping us make PHP better.
Fixed on trunk.
Previous Comments:
------------------------------------------------------------------------
[2012-02-21 10:34:39] aharvey@php.net
Automatic comment from SVN on behalf of aharvey
Revision: http://svn.php.net/viewvc/?view=revision&revision=323408
Log: Add a __wakeup() method to SplFixedArray, thereby fixing serialising an
SplFixedArray object and bug #60560 (SplFixedArray un-/serialize, getSize(),
count() return 0, keys are strings).
------------------------------------------------------------------------
[2011-12-19 13:49:25] digital1kk at interia dot pl
Quick fix is to store in serialized form internal array:
-------------------------------------
$sa = serialize($a->toArray());
$ua = unserialize($sa);
$b = SplFixedArray::fromArray($ua);
var_dump($b);
echo 'Sizeof $b = ' . $b->getSize(), PHP_EOL;
echo 'Count $b = ' . $b->count(), PHP_EOL;
-------------------------------------
Gives the expected results
Also I forgot in php >= 5.4.0RC3 (should I report this as separate bug?)
The actual result of var_dump($b) is:
$b = object(SplFixedArray)#2 (2) {
["0"]=>
int(1)
["1"]=>
int(2)
}
The keys are strings and not integers and this causes
-------------------------------------
$b = unserialize(serialize($a));
SplFixedArray::fromArray($b->toarray());
-------------------------------------
To throw an exception 'InvalidArgumentException' with message 'array must contain
only positive integer keys'
------------------------------------------------------------------------
[2011-12-19 10:31:53] digital1kk at interia dot pl
Description:
------------
If SplFixedArray object is created via unserialize() of serialized instance then the getSize() and
count() methods return 0 instead of expected actual size.
Tested on Debian Squeeze 6 64bit:
x86-5.4.0RC3-dev
Tested on windows 7 64bit:
x86-5.4.0RC3-nts
x86-5.4.0trunk(12.12)-nts
x86-5.4.0snap(13.12)-nts
x86-5.3.8-nts
x86-5.3.6-ts
x86-5.3.6-nts
x64-5.3.6-nts
x86-5.3.4-nts
x86-5.3.1-ts
Test script:
---------------
<?php
$a = new SplFixedArray(2);
$a[0] = 1;
$a[1] = 2;
echo '$a = ', var_dump($a);
echo 'Sizeof $a = ' . $a->getSize(), PHP_EOL;
echo 'Count $a = ' . $a->count(), PHP_EOL;
echo PHP_EOL;
$b = unserialize(serialize($a));
echo '$b = ', var_dump($b);
echo 'Sizeof $b = ' . $b->getSize(), PHP_EOL;
echo 'Count $b = ' . $b->count(), PHP_EOL;
Expected result:
----------------
$a = object(SplFixedArray)#1 (2) {
[0]=>
int(1)
[1]=>
int(2)
}
Sizeof $a = 2
Count $a = 2
$b = object(SplFixedArray)#2 (2) {
[0]=>
int(1)
[1]=>
int(2)
}
Sizeof $b = 2
Count $b = 2
Actual result:
--------------
$a = object(SplFixedArray)#1 (2) {
[0]=>
int(1)
[1]=>
int(2)
}
Sizeof $a = 2
Count $a = 2
$b = object(SplFixedArray)#2 (2) {
[0]=>
int(1)
[1]=>
int(2)
}
Sizeof $b = 0
Count $b = 0
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=60560&edit=1