Il SplObjectStorage
è ciò che dice il nome: una classe di archiviazione per la memorizzazione di oggetti. A differenza di altri linguaggi di programmazione, strings
non sono oggetti in PHP, sono, beh, stringhe ;-). Pertanto non ha senso memorizzare stringhe in un SplObjectStorage
- anche se le stringhe vengono racchiuse in un oggetto della classe stdClass
.
Il modo migliore per memorizzare una raccolta di stringhe univoche è utilizzare gli array (come hashtables) con la stringa come chiave e il valore (come suggerito da Ian Selby).
$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...
Si potrebbe tuttavia avvolgere questa funzionalità in una classe personalizzata:
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;
}
// ...
}
Tra l'altro si san simulare il comportamento di SplObjectStorage
per PHP 5.3.0 < e per ottenere una migliore comprensione di ciò che lo fa.
$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
$id1 => $ob1,
$id2 => $ob2
);
SplObjectStorage
memorizza un hash univoco per ogni istanza (come spl_object_hash()
) per essere in grado di identificare le istanze di oggetti. Come ho detto sopra: una stringa non è affatto un oggetto, quindi non ha un hash di istanza.L'unicità di una stringa può essere verificata confrontando i valori stringa: due stringhe sono uguali quando contengono lo stesso insieme di byte.
fonte
2009-10-01 08:08:57
Potete fornire qualche esempio codice su come memorizzare un set di stringhe univoche e poi scorrere su di esse? Perché è così difficile in PHP? – erotsppa
Non potresti semplicemente memorizzarli in un array? Sembra che tu stia complicando un po 'le cose;) –