Что произойдет, если один и тот же экземпляр объекта будет присоединен несколько раз к 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 ответ

Решение

"Ключ", используемый внутри 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

Другие вопросы по тегам