如果同一个对象实例多次附加到 SplObjectStorage 会发生什么?
What happens if the same object instance is attached multiple times to 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
在内部为每个附加对象使用的 "key" 是给定对象的哈希值(与 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
或者换句话说,我是否应该在附加之前检查它是否已经在集合中?
$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
在内部为每个附加对象使用的 "key" 是给定对象的哈希值(与 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