Frage

Jemand hat vorgeschlagen, e SplObjectStorage zu verwenden Spur einer Reihe von einzigartigen Dinge zu halten. Große, außer es nicht mit Strings funktioniert. Ein Fehler, sagt "SplObjectStorage :: attach () erwartet Parameter 1 Objekt, String in fback.php auf 59 Leitung gegeben sein"

Irgendwelche Ideen?

War es hilfreich?

Lösung

Die SplObjectStorage ist, was der Name sagt: eine Speicherklasse für Objekte zu speichern. Im Gegensatz zu einigen anderen Programmiersprachen strings keine Objekte in PHP sind, sind sie gut, Streicher ;-). Es macht daher keinen Sinn, speichern Strings in einem SplObjectStorage -., Auch wenn Sie die Saiten in einem Objekt der Klasse stdClass wickeln

Der beste Weg, eine Sammlung von einzigartigen Strings zu speichern si-Arrays zu verwenden (als Hash-Tabellen) mit dem String als Schlüssel sowie den Wert (wie von Ian Selby ).

$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...

Sie könnten jedoch wickeln diese Funktionalität in einer benutzerdefinierten Klasse:

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 simulieren Sie san das Verhalten von SplObjectStorage für PHP <5.3.0 und ein besseres Verständnis dafür zu bekommen, was sie 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  der Lage sein, Objektinstanzen zu identifizieren. Wie ich oben gesagt: ein String ist überhaupt kein Objekt, es ist also keine Instanz Hash hat. Eine Besonderheit des String kann durch den Vergleich der String-Werte überprüft werden. - zwei Saiten sind gleich, wenn sie den gleichen Satz von Bytes enthalten

Andere Tipps

Es ist ein Object Speicher. Ein String ist ein Skalar . So verwenden SplString .

Wickeln Sie die Zeichenfolge in einem stdClass?

$dummy_object = new stdClass();
$dummy_object->string = $whatever_string_needs_to_be_tracked;
$splobjectstorage->attach($dummy_object);

Allerdings würde jedes Objekt auf diese Weise erstellt noch eindeutig sein, auch wenn die Saiten identisch sind.

Wenn Sie doppelte Strings kümmern, sollten Sie vielleicht ein Hash (assoziatives Array) verwenden sie stattdessen zu verfolgen?

$myStrings = array();
$myStrings[] = 'string1';
$myStrings[] = 'string2';
...

foreach ($myStrings as $string)
{
    // do stuff with your string here...
}

Wenn Sie die Einzigartigkeit von Strings in dem Array, um sicherzustellen, Sie wollen ein paar Dinge tun könnten ... würde zuerst einfach sein array_unique () zu verwenden. Das, oder Sie können ein assoziatives Array mit den Strings als Schlüssel sowie den Werten erstellen:

$myStrings = array();
$myStrings['string1'] = 'string1';
...

Wenn Sie wollten, dies sein objektorientiert über, sie könnte etwas tun, wie:

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
}

Dann in Ihrem Code können Sie tun Dinge wie:

StringStore::$strings[] = 'string1';
...

Und läuft die gleiche Art und Weise:

foreach (StringStore::$strings as $string)
{
    // whatever
}

SplObjectStorage ist für eindeutige Instanzen von Objekten verfolgen und außerhalb nicht mit Streichern arbeiten, es ist ein bisschen übertrieben für das, was Sie versuchen, (meiner Meinung nach) zu erreichen.

Ich hoffe, das hilft!

oder vielleicht auch nur instanziiert die Zeichenfolge als ein Objekt mit __toString () Methode - auf diesem Weisen Sie beide haben können - Objekt und die Fähigkeit, sie als Zeichenfolge zu verwenden (var_dump, Echo) ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top