Question

est-il possible de faire des objets StdClass fonctionnent comme un tableau indexé génériquement?

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

serait construit comme

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

etc.

mais si je le fais avec un objet, il se remplace simplement:

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

Je sais que je peux changer 'a' chaque fois,

désolé

si cela est une question stupide, mais il me dessouchage pour une raison!

Appréciez toute aide:)

Dan

Était-ce utile?

La solution

En bref, non, parce que vous aurez toujours le nom de vos propriétés. En passant par la peine d'écrire une classe simple avec ArrayAccess n'a pas de sens non plus que vous avez essentiellement recréé un tableau avec rien à montrer pour elle, sauf sacrifices extrêmes dans la performance et la transparence.

Y at-il quelque raison que votre problème ne peut être résolu infiniment plus simplement à l'aide d'un tableau, ou est-ce juste un souhait-je-sais question?

EDIT: Consultez cette question plus d'informations.

Autres conseils

Non, vous ne pouvez pas. En utilisant les supports ([]) comme cela est appelé « ArrayAccess » en PHP, et est pas implémentée sur l'objet stdClass.

On dirait que vous peut veulent quelque chose comme

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

Vous pouvez également essayer de jeter un tableau comme stdClass pour voir ce qui se passe.

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

Je ne vois pas vraiment ce que vous entendez faire, peu de

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

Vous ne pouvez pas simplement « pousser » un champ sur un objet. Vous devez connaître le nom du champ afin de récupérer la valeur de toute façon, il est donc à peu près un non-sens.

Un objet est pas un tableau. Si vous voulez des éléments indexés numériquement, utilisez un tableau.

Si vous voulez des éléments nommés utilisent soit un objet ou un tableau Associatif.

Quant à savoir pourquoi vous obtenez un comportement différent, il est parce que dans le tableau, vous ne spécifiez pas un index, PHP utilise la longueur du tableau comme l'indice. Avec l'objet, vous devez spécifier le nom (dans ce cas « a »).

L'autre chose que vous pouvez faire est d'avoir un objet, avec un membre qui est un tableau:

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

aussi n'oubliez pas que vous pouvez jeter un tableau à un objet:

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

Seulement pour le bien de la POO, ne pas utiliser des classes. Si vous voulez vraiment implémenter cette fonctionnalité, utilisez cette 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;
        }
    }
}

Vous pouvez obtenir exactement ce JavaScript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top