The storage object will never contain more than one object with the same identifier.
As such, it can be used to implement a set (a collection of unique values)
where the quality of an object being unique is determined by the value
returned by this function being unique.
<?php class OneSpecimenPerClassStorage extends SplObjectStorage { public function getHash($o) { return get_class($o); } } class A {}
$s = new OneSpecimenPerClassStorage; $o1 = new stdClass; $o2 = new stdClass; $o3 = new A;
$s[$o1] = 1; //$o2 is considered equal to $o1 so the value is replaced $s[$o2] = 2; $s[$o3] = 3;
//these are considered equal to the objects before //so they can be used to access the values stored under them $p1 = new stdClass; $p2 = new A; echo $s[$p1], "\n"; echo $s[$p2], "\n"; ?>
The above example will output
something similar to:
This also appears to be the function which gets used within the contains() function, so if all the objects you are storing already have a unique id you can overwrite this function with your own class.
<?php class UserStorage extends SPLObjectStorage{ public function getHash($obj){ return $obj->id; } }
$us = new UserStorage(); $user1 = new User(1); $user2 = new User(2);
$us->attach($user1); $us->attach($user2);
$me = new User(2);
// the following would normally fail since they are two separate objects // but it works now with our extended getHash() $us->contains($me);