Pergunta

É possível fazer stdClass objetos funcionam como uma matriz genérica indexados?

i. $ Matriz = Array ( [0] => 120 [1] => 382 [2] => 552 [3] => 595 [4] => 616 )

seria construída como

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

etc.

Mas se eu fizer isso com um objeto que ele simplesmente substitui-se:

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

eu sei que posso mudar 'a' todas as vezes,

desculpe se esta é uma pergunta estúpida, mas isso está me stumping por alguma razão!

aprecio qualquer ajuda:)

Dan

Foi útil?

Solução

Em suma, não, porque você sempre terá de nomear suas propriedades. Atravessar o trabalho de escrever uma classe simples com ArrayAccess não faz sentido tanto quanto você essencialmente recriado um array com nada para mostrar para ele exceto sacrifícios extremos em termos de desempenho e transparência.

Existe alguma razão o problema não puder ser resolvido infinitamente mais simplesmente usando uma matriz, ou isso é apenas uma questão de desejo I-sabia?

EDIT: Confira este questão para mais informações.

Outras dicas

Não, você não pode. Usando os suportes ([]) como que é chamado de "ArrayAccess" em PHP, e não é implementado no objeto stdClass.

Parece que você pode quer algo como

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

Você também pode tentar lançar uma matriz como uma stdClass para ver o que acontece.

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

Não consigo ver realmente o que você quer dizer que fazer, curta de

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

Você não pode simplesmente "empurrar" um campo em um objeto. Você precisa saber o nome do campo, a fim de recuperar o valor de qualquer maneira, por isso é praticamente um disparate.

Um objeto não é uma matriz. Se você quiser elementos numericamente indexados, use um array.

Se você quiser elementos nomeados usar um objeto ou uma matriz associativa.

Quanto ao porquê de você está recebendo um comportamento diferente, é porque na matriz, você não está especificando um índice, de modo PHP usa o comprimento da matriz como o índice. Com o objeto, você tem que especificar o nome (neste caso 'a').

A outra coisa que você pode querer fazer é ter um objeto, com um membro que é uma matriz:

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

Também não se esqueça que você pode lançar uma matriz para um objeto:

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

Apenas por uma questão de OOP, não use classes. Se você realmente quer para implementar essa funcionalidade, usar essa classe:

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

Você pode obter exatamente isso em JavaScript.

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