2009-10-01 2 views
7

Qualcuno ha suggerito di utilizzare SplObjectStorage per tenere traccia di un insieme di cose uniche. Grande, tranne che non funziona con le stringhe. Un errore dice "SplObjectStorage :: attach() si aspetta che il parametro 1 sia oggetto, stringa data in fback.php sulla riga 59"SplObjectStorage non funziona con String, cosa fare?

Qualche idea?

risposta

8

Il SplObjectStorage è ciò che dice il nome: una classe di archiviazione per la memorizzazione di oggetti. A differenza di altri linguaggi di programmazione, strings non sono oggetti in PHP, sono, beh, stringhe ;-). Pertanto non ha senso memorizzare stringhe in un SplObjectStorage - anche se le stringhe vengono racchiuse in un oggetto della classe stdClass.

Il modo migliore per memorizzare una raccolta di stringhe univoche è utilizzare gli array (come hashtables) con la stringa come chiave e 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; 
    } 

    // ... 
} 

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

1

Avvolgere la stringa in una 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 univoco, anche se le stringhe sono identiche.

Se hai bisogno di preoccuparti delle stringhe duplicate, forse dovresti usare un hash (array associativo) per tenerne traccia?

+0

Potete fornire qualche esempio codice su come memorizzare un set di stringhe univoche e poi scorrere su di esse? Perché è così difficile in PHP? – erotsppa

+2

Non potresti semplicemente memorizzarli in un array? Sembra che tu stia complicando un po 'le cose;) –

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

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

Se ci 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 di istanze uniche di oggetti e, al di fuori del non lavoro con le stringhe, è un po 'eccessivo per ciò che si sta tentando di realizzare (a mio parere).

Spero che questo aiuti!

5

È un Oggetto Archiviazione. Una stringa è uno scalare . Quindi utilizzare SplString.

0

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