如果同一对象实例多次附加到 SplObjectStorage 会发生什么情况?



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

$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);
}
}

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

相关内容

  • 没有找到相关文章

最新更新