Introdução aos Métodos Mágicos
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 44 de 91.
Métodos mágicos são métodos especiais no PHP que começam com sublinhados duplos (__) e são chamados automaticamente pelo PHP em resposta a certos eventos ou ações. Você já usou dois deles: __construct() e __destruct().
Esses métodos permitem que você intercepte o comportamento interno do PHP e personalize como seus objetos respondem a operações comuns.
Por exemplo, o que acontece quando você tenta imprimir um objeto? Ou acessar uma propriedade que não existe? Métodos mágicos dão a você controle sobre essas situações.
Aqui está uma visão geral rápida dos métodos mágicos mais usados:
| Método | Acionado Quando |
|---|---|
__construct() | O objeto é criado |
__destruct() | O objeto é destruído |
__toString() | O objeto é usado como uma string |
__get() | Acessando uma propriedade indefinida |
__set() | Definindo uma propriedade indefinida |
__call() | Chamando um método indefinido |
__clone() | O objeto é clonado |
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book;
Saída:
Book: PHP MasterySem o __toString(), tentar dar um echo em um objeto causaria um erro. O método mágico intercepta essa ação e retorna uma representação em string em seu lugar. Nas próximas aulas, exploraremos cada método mágico em detalhes.
Desafio
FácilVamos construir um sistema de catálogo de filmes que apresenta os métodos mágicos. Você criará uma classe Movie que usa __construct() para inicializar os dados do filme e __toString() para fornecer uma representação de string limpa quando o objeto for impresso.
Você organizará seu código em dois arquivos:
Movie.php— Crie uma classeMovieque represente os filmes em seu catálogo. Use a promoção de construtor para definir propriedades privadas para$title(string),$director(string) e$year(integer). Implemente o método mágico__toString()para retornar uma string formatada:"[title] ([year]) - Directed by [director]". Isso permite que seus objetos de filme sejam exibidos com echo diretamente, sem a necessidade de chamar um método separado.main.php— Inclua o arquivo Movie. Você receberá três entradas: um título de filme, um nome de diretor e um ano de lançamento. Crie uma instância deMovieusando esses valores (converta o ano para um inteiro). Em seguida, simplesmente exiba o objeto movie diretamente com echo — o método__toString()será chamado automaticamente para produzir a saída.
A mágica do __toString() é que o PHP o chama automaticamente sempre que seu objeto é usado em um contexto de string. Em vez de escrever echo $movie->getInfo();, você pode simplesmente escrever echo $movie; e o PHP cuida da conversão para você. Isso torna seus objetos mais intuitivos de se trabalhar.
Folha de consulta
Métodos mágicos são métodos especiais no PHP que começam com sublinhados duplos (__) e são chamados automaticamente pelo PHP em resposta a certos eventos ou ações.
Métodos mágicos comuns:
| Método | Acionado Quando |
|---|---|
__construct() | O objeto é criado |
__destruct() | O objeto é destruído |
__toString() | O objeto é usado como uma string |
__get() | Acessando uma propriedade indefinida |
__set() | Definindo uma propriedade indefinida |
__call() | Chamando um método indefinido |
__clone() | O objeto é clonado |
O método __toString() retorna uma representação em string de um objeto:
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book; // Saída: Book: PHP Mastery
Sem o __toString(), tentar dar um echo em um objeto causaria um erro. O método mágico intercepta essa ação e permite que o objeto seja usado em um contexto de string.
Experimente você mesmo
<?php
require_once 'Movie.php';
// Ler a entrada
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: Criar uma instância de Movie usando os valores de entrada
// TODO: Exibir o objeto movie diretamente (o método __toString() será chamado automaticamente)
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy