Pregunta

¿es posible hacer que los objetos StdClass funcionan como una matriz indexada de forma genérica?

es decir. $ Array = array ( [0] => 120 [1] => 382 [2] => 552 [3] => 595 [4] => 616 )

sería construido como

$a = array();
$array[] = 120;
$array[] = 382;

etc.

Pero si lo hago con un objeto que sólo se sobrescribe:

$obj = new stdClass;
$obj->a = 120;
$obj->a = 382;

sé que puedo cambiar 'a' cada vez,

Lo siento si esto es una pregunta estúpida, pero me está haciendo campaña por alguna razón!

agradecería cualquier ayuda:)

Dan

¿Fue útil?

Solución

En resumen, no, porque siempre tendrá que nombrar sus propiedades. Pasar por la molestia de escribir una clase simple con ArrayAccess no tiene sentido, ya sea como usted ha recreado esencialmente una matriz con nada que mostrar excepto sacrificios extremos en el rendimiento y la transparencia.

¿Hay alguna razón su problema no se puede resolver infinitamente más simplemente mediante el uso de una matriz, o es esta pregunta sólo un deseo-I-sabía?

EDIT: Salida esta pregunta para más información.

Otros consejos

No, no se puede. El uso de los soportes ([]) como que se llama "ArrayAccess" en PHP, y no se ha implementado en el objeto stdClass.

Parece que podría que desee algo así como

$foo = new stdClass();
$foo->items = array();
$foo->items[] = 'abc';
$foo->items[] = '123';
$foo->items[] = 'you and me';

También puede probar la fundición de una matriz como stdClass a ver qué pasa.

$foo = array();
$foo[] = 'abc';
$foo[] = '123';
$foo[] = 'you and me';
$foo = (object) $foo;
var_dump($foo);

No puedo ver realmente lo que quiere decir que hacer, por debajo de

<?php
$obj->a = array();
$obj->a[] = 120;
$obj->a[] = 382;
// ...
?>

No se puede simplemente un campo de "empujar" a un objeto. Es necesario conocer el nombre del campo con el fin de recuperar el valor de todos modos, por lo que es más o menos sin sentido.

Un objeto no es una matriz. Si desea que los elementos indexados numéricamente, utilizar una matriz.

Si desea elementos nombrados utilizar un una matriz asociativa de objetos o.

En cuanto a la razón por la que está recibiendo un comportamiento diferente, es porque en la matriz, no especifica un índice, por lo que PHP usa la longitud de la matriz como índice. Con el objeto, tiene que especificar el nombre (en este caso 'a').

La otra cosa que usted puede hacer es tener un objeto, con un miembro que es un array:

$obj = new stdClass;
$obj->arr = array();
$obj->arr[] = 'foo';
$obj->arr[] = 'bar';

También no olvide que usted puede lanzar una matriz a un objeto:

$obj = (object) array(
    'arr' => array(
        'foo',
        'bar'
    )
);

Sólo en aras de la programación orientada a objetos, no utilice clases. Si realmente desea implementar esta funcionalidad, utilice esta clase:

class ArrayClass
{
    protected $storage = array();

    public function push($content) {
        $this->storage[] = $content;
        return $this;
    }

    public function get($index) {
        if (isset($this->storage[$index])) {
            return $this->storage[$index];
        } else {
            //throw an error or
            return false;
        }
    }
}

Puede conseguir exactamente esto en JavaScript.

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