0

或者换句话说,我应该在附加之前检查它是否已经在集合中吗?

$s = new SplObjectStorage();

foreach($arrayOfObjects as $primaryObject) {
    $subObject=$primaryObject->getSubObject();  //It is possible that a given instance of $subObject might be used in more than one $primaryObject
    if(!$s->contains($subObject)) {
        $s->attach($subObject);
    }
}
4

1 回答 1

3

每个附加对象内部使用的“键”SplObjectStorage是给定对象的哈希(与返回的相同spl_object_hash)。

每次调用都将有效地使用相同的哈希覆盖存储中的任何现有对象(仅当您提供相同的对象时才会发生这种情况),因此在附加对象之前attach无需调用。contains

SplObjectStorage::attach($object)实际上意味着相同

$storage[spl_object_hash($object)] = $object;

如果您使用数组作为存储。

完整演示:

class Foo {}
$foo = new Foo;
$s = new SplObjectStorage;

echo $s->count(); // 0

$s->attach($foo);
echo $s->count(); // 1

$s->attach($foo);
echo $s->count(); // 1

$s->detach($foo);
echo $s->count(); // 0

https://3v4l.org/Rft7i

于 2018-08-21T16:34:48.183 回答