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 em PHP que começam com dois sublinhados (__) e são chamados automaticamente pelo PHP em resposta a determinados eventos ou ações. Você já usou dois deles: __construct() e __destruct().
Esses métodos permitem que você se conecte ao 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? Os 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 __toString(), tentar usar echo com um objeto causaria um erro. O método mágico intercepta essa ação e retorna uma representação em string. Nas próximas lições, exploraremos cada método mágico em detalhes.
Desafio
FácilVamos criar um sistema de catálogo de filmes que apresentará a você 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 do seu catálogo. Use a promoção de construtor para definir propriedades privadas para$title(string),$director(string) e$year(inteiro). 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 diretamente com echo, sem chamar um método separado.main.php: Inclua o arquivo Movie. Você receberá três entradas: o título de um filme, o nome de um diretor e um ano de lançamento. Crie uma instância deMovieusando esses valores (converta o ano para um inteiro). Em seguida, simplesmente use echo diretamente no objeto do filme: o método__toString()será chamado automaticamente para produzir a saída.
A magia de __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 usar.
Experimente você mesmo
<?php
require_once 'Movie.php';
// Ler entrada
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: Crie uma instância de Movie usando os valores de entrada
// TODO: Faça echo do 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 OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da 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 às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem 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 NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre 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 StrategyPratique por conta própria: Compilador de PHP online