Die SplObjectStorage
ist, was der Name sagt: eine Speicherklasse zum Speichern von Objekten. Im Gegensatz zu einigen anderen Programmiersprachen sind strings
keine Objekte in PHP, sie sind, naja, Strings ;-). Es macht daher keinen Sinn, Strings in einem SplObjectStorage
zu speichern - selbst wenn Sie Ihre Strings in ein Objekt der Klasse stdClass
einbinden.
Die beste Methode zum Speichern einer Sammlung eindeutiger Zeichenfolgen ist die Verwendung von Arrays (als Hashtabellen) mit der Zeichenfolge als Schlüssel sowie dem Wert (wie von Ian Selby vorgeschlagen).
$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...
Sie könnten jedoch diese Funktionalität in einer benutzerdefinierten Klasse wickeln:
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;
}
// ...
}
Durch die Art und Weise Sie san das Verhalten von SplObjectStorage
für PHP < 5.3.0 simulieren und ein besseres Verständnis von dem, was es zu bekommen tut.
$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
$id1 => $ob1,
$id2 => $ob2
);
SplObjectStorage
speichert einen eindeutigen Hash für jede Instanz (wie spl_object_hash()
) zu können Objektinstanzen identifizieren. Wie ich oben sagte: Ein String ist überhaupt kein Objekt, daher hat er keinen Instanz-Hash.Die Eindeutigkeit einer Zeichenkette kann überprüft werden, indem die Zeichenkettenwerte verglichen werden - zwei Zeichenketten sind gleich, wenn sie die gleiche Menge von Bytes enthalten.
Können Sie einige Beispiele liefern Code, wie man eine Menge eindeutiger Strings speichert und dann über sie iteriert? Warum ist es so schwer in PHP? – erotsppa
Könnten Sie sie nicht einfach in einem Array speichern? Sieht so aus, als ob du die Dinge ein wenig verkomplizierst;) –