A classe SplObjectStorage representa uma estrutura de dados dinâmica que nos proporciona uma forma de armazenamento de objetos no formato objeto-valor. Podemos utilizar todos os tipos de dados.

O tipo SplObjectStorage implementa as interfaces abaixo:

  1. Iterator
  2. Countable
  3. ArrayAccess
  4. Serializable

Para utilizarmos a classe SplObjectStorage criamos uma instancia uma classe como na sintaxe abaixo:

Sintaxe
$variavel = new SplObjectStorage();
Onde
-
Exemplo 1
<?php
$sos = new SplObjectStorage();
?>
Saída
-

Para adicionar um elemento, utilizamos o método attach que recebe um objeto e um valor que são passados como argumentos.

Sintaxe
attach(object $object, mixed $info = null): void
Onde
$object: objeto para adição
$info: informação para associar a $object
Exemplo 2
<?php
class Teste{
//corpo omitido
}
$obj = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$valor = "uma string"; //valor associado ao objeto
$sos->attach($obj,$valor);
?>
Saída
-

Para termos conhecimento do número de elementos contidos em um SplObjectStorage, usamos o método count implementado a partir da interface countable.

Sintaxe
count(int $mode = COUNT_NORMAL): int
Onde
$mode: modo da contagem: COUNT_NORMAL ou COUNT_RECURSIVE
Retorno
Inteiro contendo o número de elementos
Exemplo 3
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$valor = "uma string qualquer"; //valor associado ao objeto
$sos->attach($classe,$valor);
echo $sos->count();
?>
Saída
1

O tipo de dado SplObjectStorage permite que seus elementos sejam acessados utilizando um objeto que é passado como argumento para o indexaxor [].

Sintaxe:
$variavel[object $objeto];
Onde
$objeto: objeto associado ao elemento
Exemplo 4
<?php
class Teste{
//corpo omitido
}

$classe = new Teste(); //objeto

$sos = new SplObjectStorage(); 
$valor = "uma string qualquer"; //valor associado ao objeto
$sos->attach($classe,$valor);

echo $sos[$classe];
?>
Saída
uma string qualquer

A alteração de um elemento contido em um SplObjectStorage, basta acessar o desejado elementos e substituir seu valor associado com um novo valor.

Sintaxe:
$variavel[object $objeto] = valor;
Onde
$objeto: objeto associado ao elemento
valor: valor para alteração
Exemplo 5
<?php
class Teste{
//corpo omitido
}

$classe = new Teste(); //objeto

$sos = new SplObjectStorage(); 
$valor = "uma string qualquer"; //valor associado ao objeto
$sos->attach($classe,$valor);

echo $sos[$classe],"\n";
$sos[$classe] = 1.99; //valor associado
echo $sos[$classe],"\n"; 
?>
Saída
uma string qualquer
1.99

Para percorrer os elementos de uma objeto SplObjectStorage, podemos utilizar o comando de repetição foreach e recuperar os valores do índice, chave e valor associado, como no exemplo abaixo.

O comando foreach assim como outros comandos de repetição foram vistos em PHP: Comandos de Repetição.

Exemplo 6
<?php
class Teste{
//corpo omitido
}

$classe = new Teste(); //objeto

$sos = new SplObjectStorage(); 
$valor = "uma string qualquer"; //valor associado ao objeto
$sos->attach($classe,$valor);

//para recuperar apenas a chave, remover $indice =>
foreach($sos as $indice => $chave )
	var_dump($indice); //
	var_dump($chave);
	echo $sos[$chave];//valor associado
?>
Saída
int(0)
object(Teste)#1 (0) {
}
uma string qualquer

Para a remoção de um elemento contido em um SplObjectStorage, utilizamos o método detach que recebe um objeto como uma "chave" associada ao elemento para sua remoção.

Sintaxe
detach(object $object): void
Onde
$object: objeto chave para remoção de elemento
Exemplo 7
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$valor = "uma string qualquer"; //valor associado ao objeto
$sos->attach($classe,$valor);
echo $sos[$classe],"\n";
echo $sos->count(),"\n";
$sos->detach($classe);
echo $sos->count(),"\n";
?>
Saída
uma string qualquer
1
0

A classe SplObjectStorage fornece métodos para manipular seus dados. Abaixo, uma lista de todos os métodos dessa classe que podem ser acessado clicando em seus nomes.

Método Descrição
addAll Adiciona todos elementos
attach Adiciona um novo elemento
contains Verificar se um elemento existe
count Retorna número de elementos
current Retorna elemento atual
detach Remover elemento
getHash -
getInfo Retorna valor associado ao elemento atual
key Retorno o índice do elemento atual
next Move iterador para próximo elemento
offsetExists Verificar se um elemento existe
offsetGet Recuperar o valor de um elemento
offsetSet Atualizar o valor de um elemento
offsetUnset Remove valor elemento contido
removeAll Remove todos os elementos
removeAllExcept Remove todos os elementos com exceções
rewind Volta o iterador para o início
serialize Serializa um SplObjectStorage
setInfo Altera o valor associado elemento atual
unserialize Deserializa um SplObjectStorage
valid Verifica se contem mais elementos

Com o método addAll podemos adicionar outros elementos contidos em um outros objeto do tipo SplObjectStorage. Os elementos são adicionados no fim.

Sintaxe
public addAll( SplObjectStorage $storage): int
Onde
$storage: objeto contendo elementos para adicionar
Retorno
Inteiro contendo o número de elementos
Exemplo
<?php
//corpo omitido
}
$classe = new Teste(); //objeto
$sos1 = new SplObjectStorage(); 
$valor = "uma string qualquer"; //valor associado ao objeto
$sos1->attach($classe,$valor);

$sos2 = new SplObjectStorage();
$classe2 = new Teste(); //objeto
$sos2->attach($classe2,$valor);
$sos2->addAll($sos1);

echo $sos2->count(); //número de elementos
?>
Saída
2

O objetivo do método attach é adicionar um novo elemento e seu valor associado a um SplObjectStorage. O objeto e valor são passados como argumento para o método.

Sintaxe
public attach(object $object, mixed $info = null): void
Onde
$object: objeto que desejamos adicionar
$info: dado associado ao objeto $object. Padrão null
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$valor = "uma string qualquer"; //valor associado ao objeto
$sos->attach($classe,$valor);
echo $sos[$classe],"\n";
echo $sos->count();
?>
Saída
1

Com o método contains podem verificar se elemento está contido em um SplObjectStorage baseado em um objeto passado como argumento.

Sintaxe
public contains(object $object): bool
Onde
$object: objeto para verificar
Retorno
true(1) se $object for encontrado, false(0) caso contrário.
Exemplo
<?php
class Teste{
//corpo omitido
}
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$sos->attach($classe,10);
echo $sos->contains($classe);
?>
Saída
1

Para remover um elemento de uma SplObjectStorage usamos o método detach que recebe um objeto como argumento.

Sintaxe
public detach(object $object): void
Onde
$object: elemento que desejamos remover
Retorno
-
Exemplo
<?php
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$sos->attach($classe,10);
$sos->attach($classe2,20);
echo $sos->count(),"\n";
$sos->detach($classe2);
echo $sos->count(),"\n";
?>
Saída
2
1

O objetivo do método getInfo é retornar o valor associado a um elemento/objeto na posição atual do iterador de um SplObjectStorage.

Sintaxe
public getInfo(): mixed
Onde
-
Retorno
Valor associado ao elemento na posição atual.
Exemplo
<?php
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$sos->attach($classe,10);
$sos->attach($classe2,30);
$obj = $sos->getInfo();
echo $obj;

?>
Saída
10

Para remover todos elementos de um SplObjectStorage baseado em uma lista de elementos pré-definida, utilizamos o método removeAll. Esse método recebe como argumento um objeto SplObjectStorage que contém os elementos a serem removidos.

Sintaxe
public removeAll( SplObjectStorage $storage ): int
Onde
$storage: objeto contendo elementos para remoção
Retorno
Inteiro contendo o número de elementos após operação
Exemplo
<?php
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto

$sos->attach($classe,10);
$sos->attach($classe2,30);
$sos->attach($classe3,30);

$sos->rewind();
foreach($sos as $indice => $chave )
	echo $indice, " ", $sos[$chave],"\n";

$remover = new SplObjectStorage();
$remover->attach($classe2,30);
$sos->removeAll($remover);

echo "\n";

$sos->rewind();
foreach($sos as $indice => $chave )
	echo $indice, " ", $sos[$chave],"\n";
?>
Saída
0 10
1 30
2 40

0 10
1 40

Para remover todos elementos contidos em um SplObjectStorage, exceto alguns elementos, utilizamos o método removeAllExcept. Esse método recebe um SplObjectStorage contendo os elementos que não devem ser excluídos.

Sintaxe
public removeAllExcept( SplObjectStorage $storage): int
Onde
$storage: objeto contendo elementos que não devem ser removidos
Retorno
Inteiro contendo o número de elementos após operação
Exemplo
<?php
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos->attach($classe,10);
$sos->attach($classe2,30);
$sos->attach($classe2,30);
echo $sos->count(),"\n";
$remover = new SplObjectStorage();
$remover->attach($classe2,30);
$sos->removeAll($remover);
echo $sos->count(),"\n";
?>
Saída
2
1

O objetivo do método setInfo é alterar o valor associado a um elemento/objeto na posição atual do iterador de um SplObjectStorage.

Sintaxe
public setInfo(mixed $info): void
Onde
$info: valor que será associado ao elemento atual
Retorno
-
Exemplo
<?php
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos->attach($classe,10);
$sos->attach($classe2,30);
$sos->attach($classe3,40);

$sos->next(); //classe2
echo $sos[$classe2],"\n";
$sos->setInfo(999);
echo $sos[$classe2];
?>
Saída
30
999

Utilizando o método current, podemos recuperar o elemento de uma SplObjectStorage na posição atual de seu iterador. Esse método não aceita argumentos.

Sintaxe
public current(): mixed
Onde
-
Retorno
Elemento na posição atual do iterador
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);
$obj = $sos->current();
echo $sos[$obj];
?>
Saída
10

O objetivo do método key é retornar o índice de um elemento contido na posição atual do iterador de um SplObjectStorage. O iterador não é incrementado.

Sintaxe
public key(): mixed
Onde
-
Retorno
Índice do elemento atual
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);
echo $sos->key();
?>
Saída
0

O método next é utilizado para mover o iterador para o próximo elemento do SplObjectStorage. Esse método não recebe argumentos e não possui valor de retorno.

Sintaxe
public next(): void
Onde
-
Retorno
-
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);

$sos->next();
echo $sos[$sos->current()];
?>
Saída
20

Utilizando o método rewind, podemos retornar a posição do iterador para o primeiro elementos do SplObjectStorage. Esse método não recebe argumentos e não tem retorno.

Sintaxe
public rewind(): void
Onde
-
Retorno
-
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);
$sos->attach($classe3,40);

$sos->next(); //20
$sos->next(); //40
echo $sos[$sos->current()],"\n";
$sos->rewind(); //10
echo $sos[$sos->current()],"\n";
?>
Saída
40
10

Com o método valid podemos verificar se a posição atual do iterador é válida para utilizar métodos current ou next, por exemplo. Esse método não possui argumento e retorno.

Sintaxe
public valid(): bool
Onde
-
Retorno
true(1) se posição do iterador é válida, false(0) caso contrário.
Exemplo
<?php
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos->attach($classe,10);
$sos->attach($classe2,30);
$sos->attach($classe3,40);

$sos->next();
echo $sos->valid(),"\n";
$sos->rewind(); 
echo $sos->valid();
$sos->next();
?>
Saída
1
1

Com o método count podemos ter conhecimento de quantos elementos existem em um SplObjectStorage. Um valor é retornado informando o número de elementos.

Sintaxe
public count(): int
Onde
-
Retorno
Inteiro contendo o número de elementos
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);
$sos->attach($classe3,40);
echo $sos->count(); 
?>
Saída
3

Com o método offsetExists podemos verificar se um elemento possui valor associado para um determinado objeto passado como argumento.

Sintaxe
public offsetExists(object $object): bool
Onde
$object: objeto para verificação de seu valor associado
Retorno
true(1) se valor existe, false(0) caso contrário
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);
$sos->attach($classe3,40);

echo $sos->offsetExists($classe); //10
?>
Saída
1

Com o método offsetGet podemos recuperar o valor de um elemento de um determinado objeto passado como argumento.

Sintaxe
public offsetGet(object $object ): mixed
Onde
$objeto: objeto para recuperar valor
Retorno
Valor do elemento na posição $objeto
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);
$sos->attach($classe3,40);

echo $sos->offsetGet($classe); //10
?>
Saída
10

O método offsetSet é utilizado para atualizar o valor de uma elemento de um determinado objeto passado como argumento.

Sintaxe
public offsetSet(mixed $object, mixed $value): void
Onde
$object: objeto cujo valor desejamos alterar.
$value: valor para atualizar.
Retorno
-
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$classe3 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);
$sos->attach($classe3,40);

echo $sos[$classe];
$sos->offsetSet($classe,100); //20
echo $sos[$classe];
?>
Saída
10
100

O método offsetUnset é utilizado para remoção de um determinado elemento contido em uma SplObjectStorage baseado em um índice que é passado como argumento.

Sintaxe
public offsetUnset(object $object): void
Onde
$object: objeto cujo elemento será removido
Retorno
-
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$classe2 = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);
$sos->attach($classe2,20);

echo $sos->count(),"\n";
$sos->offsetUnset($classe); //20
echo $sos->count();
?>
Saída
2
1

O método serialize converte uma SplObjectStorage para uma string em um formato legível contendo seus elementos com índice e valor separados por (;).

Sintaxe
public serialize(): ?string
Onde
-
Retorno
String com elementos serializados.
Exemplo
<?php
class Teste{
//corpo omitido
}
$classe = new Teste(); //objeto
$sos = new SplObjectStorage(); 
$sos->attach($classe,10);

echo $sos->serialize();
?>
Saída
x:i:1;O:5:"Teste":0:{},i:10;;m:a:0:{}

O método unserialize converte uma string serializada pelo método serialize, ou no mesmo formato retornado por esse método, de volta para uma SplObjectStorage.

Sintaxe
public unserialize(string $data): void
Onde
$data: string com elementos serializados no formato utilizado pelo método serialize.
Retorno
String com elementos no formato índice:valor;
Exemplo
<?php
class Teste{
//corpo omitido
}
$sos = new SplObjectStorage(); 
$classe = new Teste(); //objeto
$sos->attach($classe,10);

$str = $sos->serialize();
echo $str,"\n\n";
$sos->unserialize($str);
var_dump($sos);

?>
Saída
x:i:1;O:5:"Teste":0:{},i:10;;m:a:0:{}

object(SplObjectStorage)#1 (1) {
  ["storage":"SplObjectStorage":private]=>
  array(2) {
    [0]=>
    array(2) {
      ["obj"]=>
      object(Teste)#2 (0) {
      }
      ["inf"]=>   int(10)
    }
    [1]=>
    array(2) {
      ["obj"]=>
      object(Teste)#3 (0) {
      }
      ["inf"]=>   int(10)
    }
  }
}
  1. 25/08/2025 - revisão 4 - Ajustes: pontuais, sintaxes, objetivos e títulos 'serialize' e 'unserialize'
  2. 20/09/2024 - revisão 3 - Ajustes de 'sintaxe' em 'Acessando/Alterando', 'Onde' em 'key'/'rewind'; ajustes gramaticais
  3. 03/09/2024 - revisão 2 - Correção em link de objetivo: acessando/alterando
  4. 06/02/2024 - revisão 1 - correção em navegação, css de saídas e erros gramaticais
  5. 20/09/2023 - versão inicial