La classe ArrayObject

(PHP 5, PHP 7, PHP 8)

Introduction

Cette classe permet aux objets de fonctionner comme des tableaux.

Note:

Envelopper des objets avec cette classe est fondamentalement défectueux, et son utilisation avec des objets est donc déconseillée.

Synopsis de la classe

class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable {
/* Constantes */
public const int STD_PROP_LIST;
public const int ARRAY_AS_PROPS;
/* Méthodes */
public function __construct(array|object $array = [], int $flags = 0, string $iteratorClass = ArrayIterator::class)
public function append(mixed $value): void
public function asort(int $flags = SORT_REGULAR): true
public function count(): int
public function exchangeArray(array|object $array): array
public function getArrayCopy(): array
public function getFlags(): int
public function getIterator(): Iterator
public function getIteratorClass(): string
public function ksort(int $flags = SORT_REGULAR): true
public function natcasesort(): true
public function natsort(): true
public function offsetExists(mixed $key): bool
public function offsetGet(mixed $key): mixed
public function offsetSet(mixed $key, mixed $value): void
public function offsetUnset(mixed $key): void
public function serialize(): string
public function setFlags(int $flags): void
public function setIteratorClass(string $iteratorClass): void
public function uasort(callable $callback): true
public function uksort(callable $callback): true
public function unserialize(string $data): void
}

Constantes pré-définies

Options de ArrayObject

ArrayObject::STD_PROP_LIST

Les propriétés de l'objet ont leur fonctionnement normal lorsqu'on y accède depuis la liste (var_dump(), foreach, etc.).

ArrayObject::ARRAY_AS_PROPS

Les éléments peuvent être accédés comme des propriétés (lecture et écriture). La classe ArrayObject utilise sa propre logique pour accéder aux propriétés, ainsi aucun avertissement ou erreur n'est émis lors d'une tentative de lecture ou écriture de propriétés dynamiques.

Historique

Version Description
8.4.0 Les constantes de classe sont désormais typées.

Sommaire

add a note

User Contributed Notes 12 notes

up
98
php5 dot man at lightning dot hu
14 years ago
As you know ArrayObject is not an array so you can't use the built in array functions. Here's a trick around that:

Extend the ArrayObject class with your own and implement this magic method:

<?php
    public function __call($func, $argv)
    {
        if (!is_callable($func) || substr($func, 0, 6) !== 'array_')
        {
            throw new BadMethodCallException(__CLASS__.'->'.$func);
        }
        return call_user_func_array($func, array_merge(array($this->getArrayCopy()), $argv));
    }
?>

Now you can do this with any array_* function:
<?php
$yourObject->array_keys();
?>
- Don't forget to ommit the first parameter - it's automatic!

Note: You might want to write your own functions if you're working with large sets of data.
up
35
rwn dot gallego at gmail dot com
13 years ago
There is a better explanation about the ArrayObject flags (STD_PROP_LIST and ARRAY_AS_PROPS) right here: 

http://stackoverflow.com/a/16619183/1019305

Thanks to JayTaph
up
11
bub at gmail dot com
4 years ago
If you need the last key of your collection use:
<?php
array_key_last($this->getArrayCopy())
?>

In an extending class it could look like:
<?php
class Collection extends ArrayObject
{
    public function lastKey(): int
    {
        return array_key_last($this->getArrayCopy());
    }
}
?>

If you want to use any type safe collection:
<?php
class BookCollection extends Collection
{
    public function add(Book $book) : void
    {
        $this->offsetSet($book->id, $book);
    }

    // note the return type "Book"
    public function get(int $bookId) : Book 
    {
        $this->offsetGet($bookId);
    }
}
?>
up
12
deminy at deminy dot net
17 years ago
Generally variable $this can't be used as an array within an object context. For example, following code piece would cause a fatal error:

<?php
class TestThis {
    public function __set($name, $val