Pregunta

Alguien ha sugerido a e SplObjectStorage utilizar para realizar un seguimiento de un conjunto de cosas únicas. Genial, excepto que no funciona con cuerdas. Un error dice "SplObjectStorage :: adjuntar () espera parámetro de 1 a ser objeto, de cadena indicado en fback.php en la línea 59"

¿Alguna idea?

¿Fue útil?

Solución

El SplObjectStorage es lo que su nombre indica: una clase de almacenamiento para almacenar objetos. En contraste con algunos otros lenguajes de programación strings no son objetos en PHP, que son, además, las cadenas ;-). Por lo tanto, no tiene sentido para almacenar cadenas en un SplObjectStorage -. Incluso si usted envuelve sus cadenas en un objeto de clase stdClass

La mejor manera de almacenar una colección de cadenas únicas Si para utilizar matrices (como tablas hash) con la cadena como la clave, así como el valor (según lo sugerido por Ian Selby ).

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

No obstante, usted puede envolver esta funcionalidad en una clase 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;
    }

    // ... 
}

Por la forma en que san simular el comportamiento de SplObjectStorage para PHP <5.3.0 y para obtener una mejor comprensión de lo que hace.

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

SplObjectStorage almacena un hash único para cada instancia (como spl_object_hash() ) a  ser capaz de identificar instancias de objeto. Como he dicho anteriormente: una cadena no es un objeto en absoluto, por lo tanto, no tiene un hash ejemplo. La singularidad de una cadena se puede comprobar mediante la comparación de los valores de cadena -. dos cadenas son iguales cuando contienen el mismo conjunto de bytes

Otros consejos

Es un Objeto Almacenamiento. Una cadena es un escalar . Así que utilice SplString .

Envolver la cadena en un stdClass?

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

Sin embargo, cada objeto creado de esta manera seguiría siendo único, incluso si las cadenas son idénticas.

Si tiene que preocuparse por las cadenas duplicadas, tal vez debería estar usando un hash (matriz asociativa) para realizar un seguimiento de ellos en su lugar?

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

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

Si usted quiere garantizar la singularidad de las cadenas de la matriz que podría hacer un par de cosas ... primero sería utilizar simplemente array_unique (). Eso, o que podría crear una matriz asociativa con las cadenas como claves, así como los valores:

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

Si usted quería ser acerca de esta orientado a objetos, que podría hacer 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
}

A continuación, en el código que puede hacer cosas como:

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

Y repetir la misma manera:

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

SplObjectStorage es para el seguimiento de instancias únicas de objetos, y fuera de no trabajar con cuerdas, que es un poco exagerado para lo que estamos tratando de lograr (en mi opinión).

Espero que ayude!

o tal vez sólo una instancia de la cadena como un objeto con el método __toString () - de esa manera se les puede tener ambas cosas - objeto y capacidad de utilizarla como cadena (var_dump, eco) ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top