Introducción a los métodos mágicos
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 44 de 91.
Los métodos mágicos son métodos especiales en PHP que comienzan con guiones bajos dobles (__) y son llamados automáticamente por PHP en respuesta a ciertos eventos o acciones. Ya has utilizado dos de ellos: __construct() y __destruct().
Estos métodos te permiten intervenir en el comportamiento interno de PHP y personalizar cómo responden tus objetos a las operaciones comunes.
Por ejemplo, ¿qué sucede cuando intentas imprimir un objeto? ¿O acceder a una propiedad que no existe? Los métodos mágicos te dan control sobre estas situaciones.
Aquí tienes un breve resumen de los métodos mágicos más utilizados:
| Método | Se activa cuando |
|---|---|
__construct() | El objeto es creado |
__destruct() | El objeto es destruido |
__toString() | El objeto se usa como una cadena |
__get() | Acceso a una propiedad no definida |
__set() | Asignación de una propiedad no definida |
__call() | Llamada a un método no definido |
__clone() | El objeto es 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;
Salida:
Book: PHP MasterySin __toString(), intentar hacer un echo de un objeto causaría un error. El método mágico intercepta esta acción y devuelve una representación de cadena en su lugar. En las próximas lecciones, exploraremos cada método mágico en detalle.
Desafío
FácilVamos a construir un sistema de catálogo de películas que te introducirá a los métodos mágicos. Crearás una clase Movie que utiliza __construct() para inicializar los datos de la película y __toString() para proporcionar una representación de cadena limpia cuando se imprima el objeto.
Organizarás tu código en dos archivos:
Movie.php— Crea una claseMovieque represente las películas en tu catálogo. Usa la promoción de constructor para definir propiedades privadas para$title(string),$director(string) y$year(integer). Implementa el método mágico__toString()para devolver una cadena formateada:"[title] ([year]) - Directed by [director]". Esto permite que tus objetos de película sean impresos con echo directamente sin llamar a un método separado.main.php— Incluye el archivo Movie. Recibirás tres entradas: un título de película, un nombre de director y un año de estreno. Crea una instancia deMovieusando estos valores (convierte el año a un entero). Luego, simplemente imprime el objeto movie directamente con echo — el método__toString()se llamará automáticamente para producir la salida.
La magia de __toString() es que PHP lo llama automáticamente cada vez que tu objeto se utiliza en un contexto de cadena. En lugar de escribir echo $movie->getInfo();, puedes simplemente escribir echo $movie; y PHP se encarga de la conversión por ti. Esto hace que tus objetos sean más intuitivos de manejar.
Hoja de referencia
Los métodos mágicos son métodos especiales en PHP que comienzan con dobles guiones bajos (__) y son llamados automáticamente por PHP en respuesta a ciertos eventos o acciones.
Métodos mágicos comunes:
| Método | Se activa cuando |
|---|---|
__construct() | El objeto es creado |
__destruct() | El objeto es destruido |
__toString() | El objeto se usa como una cadena |
__get() | Se accede a una propiedad no definida |
__set() | Se asigna una propiedad no definida |
__call() | Se llama a un método no definido |
__clone() | El objeto es clonado |
El método __toString() devuelve una representación en cadena de un 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; // Salida: Book: PHP Mastery
Sin __toString(), intentar imprimir un objeto con echo causaría un error. El método mágico intercepta esta acción y permite que el objeto sea utilizado en un contexto de cadena.
Pruébalo tú mismo
<?php
require_once 'Movie.php';
// Leer la entrada
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: Crear una instancia de Movie utilizando los valores de entrada
// TODO: Imprimir el objeto movie directamente (el método __toString() se llamará automáticamente)
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy