web-dev-qa-db-fra.com

Classes anonymes en PHP 7

Où puis-je utiliser et dois-je utiliser des classes anonymes présentées dans PHP 7? Je ne trouve pas de cas d'utilisation pour elles.

$message = (new class() implements Message {
public function getText() { return "Message"; }});
26
Eligijus

Vous pouvez trouver les informations que vous recherchez ici , où le RFC est présenté.

Les points clés de la section Use cases sont les suivants:

  • Les tests de moquerie deviennent faciles comme bonjour. Créez des implémentations à la volée pour les interfaces, en évitant d'utiliser des API de simulation complexes.
  • Gardez l'utilisation de ces classes en dehors de la portée dans laquelle elles sont définies
  • Évitez de frapper le chargeur automatique pour les implémentations triviales
28
marcosh

Comme l'a dit Rasmus Lerdorf chez WeAreDevelopers Voir site Web, quand il parlait de nouvelles fonctionnalités en PHP7:

(Regardez-le sur YouTube )

Les classes anonymes, tout comme les fonctions anonymes; en gros, vous pouvez faire tourner les cours à la volée et les jeter. Personnellement, je n'ai jamais utilisé cela, mais il y a des gens qui disent que c'est important. Je suis encore un peu douteux, mais c'était facile à mettre en œuvre; et des gens plus intelligents que moi ont dit "Ouais, ouais, c'est utile"! D'ACCORD!

3
MAChitgarha

Le bon cas que je peux fournir est de fournir un écouteur spécifique au contexte pour ne l'utiliser qu'une seule fois ou un adaptateur pour l'écouteur externe, sans définir de classe personnalisée. Voici un exemple:

$this-apiCaller->call('api_name', $parameters, new class($businessListener) implements ApiListenerInterface 
{ 
    private $listener;

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

    public function onSuccess($result)
    {
        $this->listener->addLog(new SuccessRecord($result));
    }

    public function onFailure($error)
    {
        $this->listener->addLog(new ErrorRecord($error));
    }
});
1
ryabenko-pro

J'ai également trouvé cela utile lors de l'écriture de tests unitaires pour les traits afin que vous puissiez tester uniquement la méthode des traits, c'est-à-dire:

trait MyTrait 
{
    public method foo(): string
    {
        return 'foo';
    }
}
...
public function setUp(): void
{
    $this->testObject = (new class() {
        use MyTrait;
    });
}
public function testFoo(): void
{
    $this->assertEquals('foo', $this->testObject->foo());
}
0
W_Opoczynski

Les classes anonymes ne sont pas différentes des classes normales dans PHP sauf qu'elles doivent être créées et instanciées en même temps, ce qui signifie qu'elles peuvent être étendues à partir d'autres classes, peuvent utiliser des interfaces, etc.

Si vous pensez que vous avez besoin d'un cours très simple et que vous ne l'utilisez plus jamais ailleurs, il vous convient. Une autre raison pourrait être que vous avez besoin d'une classe simple (avec plusieurs méthodes simples) et que vous ne voulez pas consacrer de temps à la documentation, vous devez donc en créer une en déplacement pour accomplir votre tâche.

0
Mert Metin