Classe anônima PHP

Resumo : neste tutorial, você aprenderá sobre a classe anônima do PHP e como definir classes anônimas.

Introdução às classes anônimas do PHP

Até agora, você aprendeu como definir uma nova classe com um nome. Por exemplo:

<?php

class MyClass 
{
    // ...
}Linguagem de código:  PHP  ( php )

A MyClassé chamada de classe nomeada.

Uma classe anônima é uma classe sem nome declarado. O seguinte cria um objeto de classe anônima:

<?php

$myObject = new class {
    // ...
};Linguagem de código:  PHP  ( php )

Nesta sintaxe, você coloca a classpalavra-chave após a newpalavra-chave. A $myObjecté a instância da classe anônima.

Dentro dos parênteses, você pode definir construtor , destruidor , propriedades e métodos para a classe anônima como uma classe normal. Por exemplo:

<?php

$logger = new class {
    public function log(string $message): void
    {
        echo $message . '<br>';
    }
};

$logger->log('Hello');Linguagem de código:  PHP  ( php )

Como funciona.

Primeiro, crie o $loggerobjeto da classe anônima que possui um método log()que exibe uma mensagem com uma
tag.

Segundo, chame o log()método através do $loggerobjeto.

Internamente, o PHP gera um nome para a classe anônima. Para obter o nome gerado, você pode usar a get_class()função. Por exemplo:

echo get_class($logger);Linguagem de código:  PHP  ( php )

Saída:

index.php0000025F568665BELinguagem de código:  PHP  ( php )

PHP gerencia esse nome de classe internamente. Portanto, você não deve confiar nisso.

Implementando uma interface

Um anônimo pode implementar uma ou múltiplas interfaces . Por exemplo:

<?php

interface Logger
{
    public function log(string $message): void;
}

$logger = new class implements Logger {
    public function log(string $message): void
    {
        echo $message . '<br>';
    }
};

$logger->log('Hello');Linguagem de código:  PHP  ( php )

Neste exemplo, definimos a Loggerinterface que possui o log()método. E então, definimos uma classe anônima que implementa a Loggerinterface.

A $loggeré a instância da Loggerinterface:

echo $logger instanceof Logger; // trueLinguagem de código:  PHP  ( php )

Como um anônimo não possui um nome declarado, você não pode usar a dica de tipo para sua instância.

No entanto, quando uma classe anônima implementa uma interface, você pode usar a dica de tipo por meio da interface. Por exemplo:

<?php

interface Logger
{
    public function log(string $message): void;
}

$logger = new class implements Logger {
    public function log(string $message): void
    {
        echo $message . '<br>';
    }
};

// type hint
function save(Logger $logger)
{
    $logger->log('The file was updated successfully.');
}

save($logger);Linguagem de código:  PHP  ( php )

Herdando uma classe

Como uma classe normal, uma classe pode herdar de uma classe nomeada . Por exemplo:

<?php

interface Logger
{
    public function log(string $message): void;
}

abstract class SimpleLogger implements Logger
{
    protected $newLine;

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

    abstract public function log(string $message): void;
}

$logger = new class(true) extends SimpleLogger {
    public function __construct(bool $newLine)
    {
        parent::__construct($newLine);
    }

    public function log(string $message): void
    {
        echo $this->newLine ? $message . PHP_EOL : $message;
    }
};

$logger->log('Hello');
$logger->log('Bye');Linguagem de código:  PHP  ( php )

Como funciona.

Primeiro, defina uma interface chamada Logger que possui um método log().

Segundo, defina uma classe abstrata chamada SimpleLoggerque implemente a Loggerinterface.

Terceiro, defina uma classe anônima que estenda a SimpleLoggerclasse. Chamamos o construtor da SimpleLoggerclasse no construtor da classe anônima.

Para passar um argumento ao construtor, colocamos-o entre parênteses após a classpalavra-chave.

Finalmente, chame o log()método do $loggerobjeto.

Quando usar classes anônimas

Aulas anônimas são úteis em alguns casos:

Primeiro, as classes anônimas facilitam a simulação de testes. Observe que você aprenderá sobre testes de unidade com PHPUnit posteriormente.

Segundo, as classes anônimas mantêm seu uso fora do escopo onde são definidas. Por exemplo, em vez de fazer isso:

<?php

class ConsoleLogger 
{
    public function log($message) 
    {
        echo $message . PHP_EOL;
    }
}

$obj->setLogger(new ConsoleLogger());Linguagem de código:  PHP  ( php )

Agora, você pode usar uma classe anônima assim:

$obj->setLogger(new class {
    public function log($msg) {
       echo $message . PHP_EOL;
    }
});Linguagem de código:  PHP  ( php )

Terceiro, faça uma pequena otimização evitando acessar o autoloader para classes triviais.

Resumo

  • Uma classe anônima é uma classe sem nome declarado.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *