SplObjectStorage
- это то, что говорит его название: класс хранения для хранения объектов. В отличие от некоторых других языков программирования strings
не являются объектами в PHP, они, ну, в общем, строки ;-). Поэтому нет смысла хранить строки в SplObjectStorage
- даже если вы оберните свои строки в объект класса stdClass
.
Лучший способ сохранить коллекцию уникальных строк si для использования массивов (в качестве хеш-таблиц) со строкой в качестве ключа и значением (как предложено Ian Selby ).
$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...
Однако вы можете обернуть эту функцию в пользовательский класс:
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;
}
// ...
}
Кстати, вы можете смоделировать поведение SplObjectStorage
для PHP <5.3.0 и лучше понять, что он делает. </p>
$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
$id1 => $ob1,
$id2 => $ob2
);
SplObjectStorage
сохраняет уникальный хэш для каждого экземпляра (например, spl_object_hash()
) для
быть в состоянии идентифицировать экземпляры объекта. Как я уже говорил выше: строка вообще не является объектом, поэтому она не имеет хэша экземпляра. Уникальность строки можно проверить путем сравнения строковых значений - две строки равны, если они содержат одинаковый набор байтов.