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

时间:2018-08-21 16:26:04

标签: php storage spl 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);
    }
}

1 个答案:

答案 0 :(得分: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