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

0

Решение

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]