Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Objets comme clés dans foreach

<?php

// Weakmaps accepts objects and arrays as keys
$source = new Weakmap();
$key = (object) ['a' => 2];
$source[$key] = 1;

// Yield may emit objects and arrays as keys
$source = function () {
    yield (object) ['a' => 3] => 1;
};
// This is just for illustration
$source = $source();

// An iterator may return objects and arrays as keys(mixed, in fact)
class myIterator implements Iterator {
    private int $position = 0;

    public function rewind(): void { $this->position = 0; }
    public function current(): mixed { return 1; }
    public function key(): mixed {
        return (object) ['a' => 4];
    }
    public function next(): void { ++$this->position; }
    public function valid(): bool { return $this->position == 0; }
}
$source = new myIterator();

foreach($source as $key => $value) {
    print get_class($key); // Stdclass
    print $value;        // 1
}

foreach() fonctionne généralement sur des tableaux, où les clés sont soit des entiers, soit des chaînes. Plus de null ni de booléen, mais surtout, pas de tableaux ni d’objets. Pourtant, il existe trois solutions pour faire apparaître un objet comme clé, plutôt que comme valeur (ou aussi comme valeur).

La première option est d’utiliser un objet Weakmap, qui utilise la syntaxe tableau et accepte n’importe quoi comme clés.

Ensuite, on peut utiliser un générateur, en faisant yield de n’importe quel type à gauche et à droite de l’opérateur =>. Notez que cela ne fonctionnera pas avec yield from, qui requiert un tableau.

Enfin, on peut utiliser un itérateur, qui dispose d’une méthode dédiée key, avec un type de retour mixed.

Bien que cela ne soit pas courant en PHP, d’autres langages acceptent de telles structures, et peuvent les transmettre à PHP pour un traitement ultérieur.

See Also

PHP Error Messages

PHP Features

Last updated: 11 October 2026