SplObjectStorage::detach

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplObjectStorage::detachQuita un object de el almacenamiento

Descripción

public SplObjectStorage::detach(object $object): void

Quita un object de el almacenamiento.

Parámetros

object

El object a ser removido.

Valores devueltos

No devuelve ningún valor.

Ejemplos

Ejemplo #1 Ejemplo de SplObjectStorage::detach()

<?php
$o
= new stdClass;
$s = new SplObjectStorage();
$s->attach($o);
var_dump(count($s));
$s->detach($o);
var_dump(count($s));
?>

El resultado del ejemplo sería algo similar a:

int(1)
int(0)

Ver también

add a note add a note

User Contributed Notes 3 notes

up
9
r dot wilczek at web-appz dot de
13 years ago
Detaching the current entry from the storage prevents SplObjectStorage::next() to operate.

Example as a PHPUnit-test:

<?php
public function testDetachingCurrentPreventsNext()
{
   
$storage = new SplObjectStorage;
   
$storage->attach(new stdClass);
   
$storage->attach(new stdClass);
   
$storage->rewind();
   
$iterated = 0;
   
$expected = $storage->count();
    while (
$storage->valid()) {
       
$iterated++;
       
$storage->detach($storage->current());
       
$storage->next();
    }
   
$this->assertEquals($expected, $iterated);
}
?>

This test will fail, for the iteration will never reach the second stdClass.
SplObjectStorage::next() obviously relies on the current element to be valid.

If you want to detach objects during iterations, you should dereference objects, before you call next() and detach the reference after next():

<?php
public function testDetachingReferenceAfterNext()
{
   
$storage = new SplObjectStorage;
   
$storage->attach(new stdClass);
   
$storage->attach(new stdClass);
   
$storage->rewind();
   
$iterated = 0;
   
$expected = $storage->count();
    while (
$storage->valid()) {
       
$iterated++;
       
$object = $storage->current();
       
$storage->next();
       
$storage->detach($object);
    }
   
$this->assertEquals($expected, $iterated);
}
?>

This test will pass.
up
3
alan dot bem at gmail dot com
10 years ago
SplObjectSotage::detach() has a bug - it rewinds internal array pointer.
Remember that - when looping over the storage - as it has no workaround.

https://bugs.php.net/bug.php?id=65629&edit=2
up
0
Hayley Watson
6 years ago
No complaints from SplObjectStorage if you try to detach an object that isn't in the collection; it's a no-op.

<?php

$o
= new StdClass;
$t = new StdClass;
$s = new SplObjectStorage();
$s->attach($o);
var_dump(count($s));
$s->detach($t); // Didn't attach this one.
var_dump(count($s));

?>
To Top