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 dos guiones bajos (__) y PHP los llama automáticamente en respuesta a determinados eventos o acciones. Ya has usado dos de ellos: __construct() y __destruct().
Estos métodos te permiten conectarte al comportamiento interno de PHP y personalizar cómo responden tus objetos a las operaciones habituales.
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 resumen rápido de los métodos mágicos más utilizados:
| Método | Se activa cuando |
|---|---|
__construct() | Se crea el objeto |
__destruct() | Se destruye el objeto |
__toString() | El objeto se utiliza como una cadena |
__get() | Se accede a una propiedad no definida |
__set() | Se establece una propiedad no definida |
__call() | Se llama a un método no definido |
__clone() | Se clona el 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 MasterySin __toString(), intentar mostrar un objeto con echo provocaría un error. El método mágico intercepta esta acción y devuelve en su lugar una representación en forma de cadena. En las próximas lecciones, exploraremos cada método mágico en detalle.
Desafío
FácilConstruyamos un sistema de catálogo de películas que te introduzca 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 imprime el objeto.
Organizarás tu código en dos archivos:
Movie.php: Crea una claseMovieque represente las películas de tu catálogo. Usa la promoción del constructor para definir propiedades privadas para$title(cadena),$director(cadena) y$year(entero). 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 se impriman directamente sin llamar a un método separado.main.php: Incluye el archivo Movie. Recibirás tres entradas: el título de una película, el nombre de un director y un año de estreno. Crea una instancia deMovieusando estos valores (convierte el año en un entero). Después, simplemente imprime directamente el objeto de película: 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 escribir simplemente echo $movie; y PHP se encarga de la conversión por ti. Esto hace que trabajar con tus objetos sea más intuitivo.
Pruébalo tú mismo
<?php
require_once 'Movie.php';
// Leer entrada
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: Crea una instancia de Movie usando los valores de entrada
// TODO: Haz echo del 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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online