Menu
Coddy logo textTech

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étodoAcionado 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 Mastery

Sem 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.

challenge icon

Desafio

Fácil

Vamos 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 classe Movie que 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 de Movie usando 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étodoAcionado 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)

?>
quiz iconTeste seus conhecimentos

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