Pergunta

Alguém sugeriu ao e usar SplObjectStorage para acompanhar um conjunto de coisas únicas. Grande, exceto que ele não funciona com strings. Um erro diz "SplObjectStorage :: attach () espera o parâmetro 1 para ser objeto, string dada em fback.php on line 59"

Todas as idéias?

Foi útil?

Solução

O SplObjectStorage é o que seu nome diz: uma classe de armazenamento para armazenar objetos. Em contraste com algumas outras linguagens de programação strings não são objetos em PHP, eles são, bem, cordas ;-). É, portanto, não faz sentido para armazenar cadeias de caracteres em um SplObjectStorage -. Mesmo se você quebrar as cordas em um objeto de stdClass classe

A melhor maneira de armazenar uma coleção de strings única si usar matrizes (como hashtables) com a corda como a chave, bem como o valor (como sugerido por Ian Selby ).

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

Você poderia, contudo, enrole essa funcionalidade em uma classe personalizada:

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;
    }

    // ... 
}

Pela maneira que você san simular o comportamento de SplObjectStorage para PHP <5.3.0 e para obter uma melhor compreensão do que ele faz.

$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
    $id1 => $ob1,
    $id2 => $ob2
);

lojas SplObjectStorage um hash exclusivo para cada instância (como spl_object_hash() ) para ser capaz de identificar ocorrências de objectos. Como eu disse acima: uma string não é um objeto em tudo, portanto, não tem um hash de instância. singularidade de uma string pode ser verificado através da comparação dos valores de cadeia -. dois strings são iguais quando eles contêm o mesmo conjunto de bytes

Outras dicas

É um objeto Armazenamento. Uma corda é um escalar . Portanto, use SplString .

Enrole a corda em um stdClass?

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

No entanto, cada objeto criado desta maneira ainda seria único, mesmo que as cordas são idênticos.

Se você precisa se preocupar com cordas duplicados, talvez você deve estar usando um hash (matriz associativa) para rastreá-los em vez disso?

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

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

Se você quiser garantir a exclusividade de cordas na matriz que você poderia fazer um par de coisas ... primeira seria a de simplesmente usar array_unique (). Que, ou você pode criar uma matriz associativa com as cordas como chaves, bem como os valores:

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

Se você queria ser sobre esta orientada a objetos, você poderia fazer algo como:

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
}

Então, em seu código, você pode fazer coisas como:

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

E iterate da mesma maneira:

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

SplObjectStorage é para rastrear instâncias exclusivas de objetos, e fora de não trabalhar com cordas, é um pouco overkill para o que você está tentando realizar (em minha opinião).

Espero que ajude!

ou talvez apenas instanciar sua seqüência como um objeto com __toString () método - que maneira você pode ter os dois - objeto e capacidade de usá-lo como string (var_dump, eco) ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top