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 class
palavra-chave após a new
palavra-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 $logger
objeto 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 $logger
objeto.
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.php0000025F568665BE
Linguagem 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 Logger
interface que possui o log()
método. E então, definimos uma classe anônima que implementa a Logger
interface.
A $logger
é a instância da Logger
interface:
echo $logger instanceof Logger; // true
Linguagem 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 SimpleLogger
que implemente a Logger
interface.
Terceiro, defina uma classe anônima que estenda a SimpleLogger
classe. Chamamos o construtor da SimpleLogger
classe no construtor da classe anônima.
Para passar um argumento ao construtor, colocamos-o entre parênteses após a class
palavra-chave.
Finalmente, chame o log()
método do $logger
objeto.
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.