Или, другими словами, стоит ли проверять, находится ли он уже в наборе, прежде чем прикреплять его?
$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
Других решений пока нет …