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