SplObjectStorage ne fonctionne pas avec la chaîne, ce qu'il faut faire?

StackOverflow https://stackoverflow.com/questions/1501726

  •  19-09-2019
  •  | 
  •  

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?

Était-ce utile?

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) ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top