SplObjectStorage
es lo que su nombre indica: una clase de almacenamiento para almacenar objetos. En contraste con algunos otros lenguajes de programación strings
no son objetos en PHP, son, bueno, cadenas ;-). Por lo tanto, no tiene sentido almacenar cadenas en un SplObjectStorage
, incluso si ajusta sus cadenas en un objeto de la clase stdClass
.
La mejor manera de almacenar una colección de cadenas únicas es usar matrices (como tablas) con la cadena como clave y el valor (según lo sugerido por Ian Selby).
$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...
Se puede envolver sin embargo esta funcionalidad en una clase personalizada:
class UniqueStringStorage // perhaps implement Iterator
{
protected $_strings = array();
public function add($string)
{
if (!array_key_exists($string, $this->_strings)) {
$this->_strings[$string] = $string;
} else {
//.. handle error condition "adding same string twice", e.g. throw exception
}
return $this;
}
public function toArray()
{
return $this->_strings;
}
// ...
}
Por cierto que san simular el comportamiento de SplObjectStorage
para PHP 5.3.0 y < para obtener una mejor comprensión de lo que hace.
$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
$id1 => $ob1,
$id2 => $ob2
);
SplObjectStorage
almacena un hash único para cada instancia (como spl_object_hash()
) para sean capaces de identificar instancias de objeto. Como dije antes: una cadena no es un objeto en absoluto, por lo tanto, no tiene un hash de instancia.La singularidad de una cadena se puede comprobar comparando los valores de cadena: dos cadenas son iguales cuando contienen el mismo conjunto de bytes.
¿Puede dar algunos ejemplos código sobre cómo almacenar un conjunto de cadenas únicas y luego iterar sobre ellas? ¿Por qué es tan difícil en php? – erotsppa
¿No podría simplemente almacenarlos en una matriz? Parece que estás complicando un poco las cosas;) –