Zgodnie z nazwą: SplObjectStorage
: klasa pamięci do przechowywania obiektów. W przeciwieństwie do niektórych innych języków programowania strings
nie są obiektami w PHP, są one, no, łańcuchami ;-). Dlatego nie ma sensu przechowywanie ciągów w kodzie SplObjectStorage
- nawet jeśli zawijasz ciągi znaków w obiekcie klasy stdClass
.
Najlepszy sposób przechowywania kolekcji unikatowych łańcuchów si do użycia tablic (jako hashtables) z ciągiem znaków jako kluczem oraz wartością (zgodnie z sugestią Ian Selby).
$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...
Można jednak owinąć tej funkcji w niestandardowej klasy:
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;
}
// ...
}
Przy okazji san symulować zachowanie SplObjectStorage
dla PHP < 5.3.0 i uzyskać lepsze zrozumienie tego, co robi.
$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
$id1 => $ob1,
$id2 => $ob2
);
SplObjectStorage
przechowuje unikalny mieszania w każdym przypadku (jak spl_object_hash()
) do stanie zidentyfikować przykłady obiektów. Jak już wspomniałem powyżej: ciąg znaków nie jest wcale obiektem, dlatego nie ma wartości skrótu instancji.Unikalność łańcuchów można sprawdzić, porównując wartości łańcuchowe - dwa łańcuchy są równe, jeśli zawierają ten sam zestaw bajtów.
można zapewnić pewną próbkę kod, w jaki sposób przechowywać zestaw unikatowych ciągów, a następnie iterować nad nimi? Dlaczego jest tak trudno w php? – erotsppa
Nie możesz po prostu zapisać ich w tablicy? Wygląda na to, że trochę komplikujesz;) –