Domanda

Qualcuno ha suggerito a e da usare SplObjectStorage per tenere traccia di un insieme di cose uniche. Ottimo, tranne che non funziona con le stringhe. Un errore dice "SplObjectStorage :: attach () si aspetta parametro 1 per essere oggetto, string data in fback.php on line 59"

Tutte le idee?

È stato utile?

Soluzione

Il SplObjectStorage è quello che dice il suo nome: una classe di memoria per l'archiviazione di oggetti. A differenza di alcuni altri linguaggi di programmazione strings non sono oggetti in PHP, che sono, beh, le stringhe ;-). Ha quindi non ha senso per memorizzare le stringhe in un SplObjectStorage -. Anche se si avvolgono le corde in un oggetto della classe stdClass

Il modo migliore per conservare una collezione di stringhe univoche SI usare array (come tabelle hash) con la stringa come la chiave, così come 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;
    }

    // ... 
}

Per il modo in cui san simulare il comportamento di SplObjectStorage per PHP <5.3.0 e per ottenere una migliore comprensione di ciò che 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 è un oggetto affatto, quindi non ha un hash istanza. l'unicità di una stringa può essere verificata confrontando i valori di stringa -. due stringhe sono uguali quando contengono lo stesso insieme di bytes

Altri suggerimenti

E 'un Oggetto di archiviazione. Una stringa è una scalare . Così utilizzare SplString .

Avvolgete la stringa in uno stdClass?

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

Tuttavia, ogni oggetto creato in questo modo sarebbe ancora unico nel suo genere, anche se le stringhe sono identiche.

Se avete bisogno di preoccuparsi di stringhe duplicate, forse si dovrebbe utilizzare un hash (array associativo) per tenere traccia di loro, invece?

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

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

Se si vuole assicurare l'unicità di stringhe nella matrice si potrebbe fare un paio di cose ... prima sarebbe di usare semplicemente array_unique (). Che, o è possibile creare un array associativo con le stringhe come chiavi così come i valori:

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

Se si voleva essere orientato agli oggetti su questo, si potrebbe fare qualcosa di simile:

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
}

Poi, nel codice si possono fare cose come:

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

E iterare allo stesso modo:

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

SplObjectStorage è per il monitoraggio istanze univoche di oggetti, e al di fuori di non lavorare con le stringhe, è un po 'eccessivo per quello che stai cercando di realizzare (a mio parere).

Speranza che aiuta!

o forse solo istanziare la stringa come un oggetto con __toString () il metodo - in questo modo si può avere tutti e due - oggetto e la capacità di usarlo come stringa (var_dump, eco) ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top