SplObjectStorage ne fonctionne pas avec la chaîne, ce qu'il faut faire?
Question
Quelqu'un a suggéré d'utiliser e SplObjectStorage pour garder la trace d'un ensemble de choses uniques. Grand, sauf qu'il ne fonctionne pas avec des cordes. Une erreur dit « SplObjectStorage :: attach () attend le paramètre 1 pour être objet, chaîne donnée dans fback.php en ligne 59 »
Toutes les idées?
La solution
Le SplObjectStorage
est ce que son nom l'indique: une classe de stockage pour stocker des objets. Contrairement à d'autres langages de programmation strings
ne sont pas des objets en PHP, ils sont, bien, cordes ;-). Il est donc absurde de stocker les chaînes dans un SplObjectStorage
-. Même si vous enveloppez vos cordes dans un objet de stdClass
de classe
La meilleure façon de stocker une collection de chaînes uniques Sí à utiliser des tableaux (comme) hashtables avec la chaîne comme la clé ainsi que la valeur (comme suggéré par Ian Selby ).
$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...
Vous pouvez toutefois envelopper cette fonctionnalité dans une classe personnalisée:
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;
}
// ...
}
Par la façon dont vous san simuler le comportement de SplObjectStorage
pour PHP <5.3.0 et pour obtenir une meilleure compréhension de ce qu'il fait.
$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
$id1 => $ob1,
$id2 => $ob2
);
SplObjectStorage
stocke un hachage unique pour chaque instance (comme spl_object_hash()
) à
être en mesure d'identifier les instances d'objet. Comme je l'ai dit plus haut: une chaîne n'est pas un objet du tout, il n'a donc pas un hachage d'instance. Vous pouvez vérifier l'unicité Une chaîne en comparant les valeurs de chaîne -. deux chaînes sont égales quand elles contiennent le même ensemble d'octets
Autres conseils
Il est Objet Stockage. Une chaîne est une scalaire . Il faut donc utiliser SplString .
Enveloppez la chaîne dans un stdClass?
$dummy_object = new stdClass();
$dummy_object->string = $whatever_string_needs_to_be_tracked;
$splobjectstorage->attach($dummy_object);
Cependant, chaque objet créé de cette façon serait toujours unique, même si les chaînes sont identiques.
Si vous devez vous soucier de chaînes en double, peut-être vous devriez utiliser un hachage (tableau associatif) pour les suivre à la place?
$myStrings = array();
$myStrings[] = 'string1';
$myStrings[] = 'string2';
...
foreach ($myStrings as $string)
{
// do stuff with your string here...
}
Si vous voulez assurer l'unicité des chaînes du tableau que vous pourriez faire quelques choses ... Tout d'abord serait d'utiliser simplement array_unique (). Ce, ou vous pouvez créer un tableau associatif avec les chaînes que les clés ainsi que les valeurs:
$myStrings = array();
$myStrings['string1'] = 'string1';
...
Si vous voulez être à ce sujet, vous pourriez faire quelque chose comme orienté objet:
class StringStore
{
public static $strings = array();
// helper functions, etc. You could also make the above protected static and write public functions that add things to the array or whatever
}
Ensuite, dans votre code, vous pouvez faire des choses comme:
StringStore::$strings[] = 'string1';
...
itérer de la même façon:
foreach (StringStore::$strings as $string)
{
// whatever
}
SplObjectStorage est pour le suivi des cas uniques d'objets, et à l'extérieur de ne pas travailler avec des cordes, il est un peu exagéré pour ce que vous essayez d'accomplir (à mon avis).
L'espoir qui aide!
Ou Peut-être juste instancier votre chaîne comme un objet avec la méthode __toString () - cette façon, vous pouvez les avoir à la fois - objet et sa capacité à l'utiliser sous forme de chaîne (var_dump, écho) ..