## Classes anonymes

Les classes anonymes sont utiles lorsque de simples objets uniques ont besoin d'être créés.

    <?php

    // Utilisant une classe explicite
    class Logger
    {
        public function log($msg)
        {
            echo $msg;
        }
    }

    $util->setLogger(new Logger());

    // Utilisant une classe anonyme
    $util->setLogger(new class {
        public function log($msg)
        {
            echo $msg;
        }
    });

On peut leur passer des arguments via le constructeur, elles peuvent étendre d'autres classes, implémenter des interfaces ou utiliser des traits comme avec une classe normale.

    <?php

    class SomeClass {}
    interface SomeInterface {}
    trait SomeTrait {}

    var_dump(new class(10) extends SomeClass implements SomeInterface {
        private $num;

        public function __construct($num)
        {
            $this->num = $num;
        }

        use SomeTrait;
    });

L'exemple ci-dessus va afficher :

    object(class@anonymous)#1 (1) {
      ["Command line code0x104c5b612":"class@anonymous":private]=>
      int(10)
    }

Imbriquer une classe anonyme à l'intérieur d'une autre classe ne donne pas accès aux méthodes ou propriétés privées ou protégées de la classe contenante. Afin d'utiliser des méthodes ou propriétés protégées de la classe contenante, la classe anonyme doit étendre celle-ci. Pour utiliser les propriétés privées de la classe contenante dans la classe anonyme, celles-ci doivent être passées via le constructeur.

    <?php

    class Outer
    {
        private $prop = 1;
        protected $prop2 = 2;

        protected function func1()
        {
            return 3;
        }

        public function func2()
        {
            return new class($this->prop) extends Outer {
                private $prop3;

                public function __construct($prop)
                {
                    $this->prop3 = $prop;
                }

                public function func3()
                {
                    return $this->prop2 + $this->prop3 + $this->func1();
                }
            };
        }
    }

    echo (new Outer)->func2()->func3();

L'exemple ci-dessus va afficher :

    6

Tous les objets créés par la même déclaration de classe anonyme sont des instances de cette même classe.

    <?php
    function anonymous_class()
    {
        return new class {};
    }

    if (get_class(anonymous_class()) === get_class(anonymous_class())) {
        echo 'même classe';
    } else {
        echo 'classe différente';
    }

L'exemple ci-dessus va afficher :

    même classe

> Note:

> Il est à noter que les classes anonymes sont affectées d'un nom par le moteur, comme l'illustre l'exemple suivant. Ce nom doit être considéré comme un détail de mise en œuvre, qui ne doit pas être invoqué.

>     <?php
>     echo get_class(new class {});

> Résultat de l'exemple ci-dessus est similaire à :

>     class@anonymous/in/oNi1A0x7f8636ad2021

### Classes anonymes en lecture seule

À partir de PHP 8.3.0, le modificateur `readonly` peut être appliqué aux classes anonymes.

Exemple #1 Définir une classe anonyme en lecture seule

    <?php
    // Utilisation d'une classe anonyme
    var_dump(new readonly class('[DEBUG]') {
        public function __construct(private string $prefix)
        {
        }

        public function log($msg)
        {
            echo $this->prefix . ' ' . $msg;
        }
    });

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open