|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #70418 SplObjectStorage not replacing objects when hash matches
Submitted: 2015-09-03 11:32 UTC Modified: 2015-09-03 17:22 UTC
Avg. Score:4.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: richardh at channelgrabber dot com Assigned:
Status: Verified Package: SPL related
PHP Version: 5.5.28 OS:
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2015-09-03 11:32 UTC] richardh at channelgrabber dot com
If you change how the SplObjectStorage calculates an objects hash, and then attach an object which will create the same hash as a currently stored object, SplObjectStorage will silently drop the new object rather than replacing the current object at that hash with the new one. This means that if the object differs from the stored object, those changes are also dropped which can result in unexpected behaviour when iterating over the stored objects.

This conflict with how arrays work when reassigning a value for the same index.

Test script:
class IdObjectStorage extends SplObjectStorage {
    public function getHash($object) { return (string) $object->id; }

$storage = new IdObjectStorage(); $array = [];

$object1 = new stdClass(); $object1->id = 1; $object1->value = 'Object #1';
$array[$object1->id] = $object1;

foreach($storage as $x) var_dump($x->value); // Object #1
foreach($array as $x)   var_dump($x->value); // Object #1

$object2 = new stdClass(); $object2->id = 1; $object2->value = 'Object #2';
$array[$object2->id] = $object2;

foreach($storage as $x) var_dump($x->value); // Object #1
foreach($array as $x)   var_dump($x->value); // Object #2

Expected result:
SplObjectStorage should work the same as arrays, in that when an object is attached with the same hash as a current entry, that entry is replaced with the new object.

string(9) "Object #1"
string(9) "Object #1"
string(9) "Object #2"
string(9) "Object #2"

Actual result:
SplObjectStorage silently drops the new object as it already has an object for that hash.

string(9) "Object #1"
string(9) "Object #1"
string(9) "Object #1"
string(9) "Object #2"


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2015-09-03 15:11 UTC]
-Status: Open +Status: Verified
 [2015-09-03 15:11 UTC]
Confirmed: <>
 [2015-09-03 17:22 UTC]
Actually, that behavior[1] is part of the ability to store
additional info with the object. The idea is obviously that it
should be possible to change the info only, but leave the object
as is, by calling ::attach() again with the same object. Of
course, that works fine with the default hashes...

[1] <>
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Sun Sep 19 04:03:37 2021 UTC