Métodos Mágicos (__toString, __get, __set, __invoke, __clone)
Aprende a interceptar eventos del ciclo de vida de los objetos en PHP con métodos mágicos: conversión a string, clonación profunda y objetos invocables.
¿Qué son los Métodos Mágicos en PHP?
En PHP, los métodos mágicos son métodos especiales reservados que comienzan con un doble guión bajo (__). Nunca se invocan de forma directa en el código habitual; en su lugar, el motor de PHP los dispara automáticamente cuando el objeto reacciona a ciertas acciones del entorno.
Ya conoces el más popular de todos: __construct(). En este tema exploraremos los más útiles para el desarrollo backend profesional.
Catálogo de Métodos Mágicos Indispensables
| Método Mágico | Cuándo se Dispara | Caso de Uso Real |
|---|---|---|
__toString(): string |
Cuando el objeto se imprime con echo $obj; o se concatena. |
Imprimir objetos como HTML, formatos de moneda o identificadores UUID. |
__invoke(...$args) |
Cuando el objeto se llama como si fuera una función: $obj(); |
Action Classes o Single Responsibility Handlers en APIs. |
__clone() |
Cuando se duplica el objeto con la palabra clave clone $obj; |
Clonación profunda (Deep Copy) para duplicar objetos anidados. |
__debugInfo(): array |
Cuando el objeto se pasa a var_dump($obj). |
Ocultar datos sensibles (contraseñas, tokens de API) en registros de depuración. |
⚡ Value Object Dinero con __toString(), __invoke() y Clonación
Ejecuta el código en el Sandbox y observa cómo los métodos mágicos transforman la experiencia de uso:
<?php
declare(strict_types=1);
// Value Object que representa una cantidad monetaria
final class Dinero
{
public function __construct(
private float $cantidad,
private string $divisa = 'USD'
) {}
// 1. __toString(): Se dispara al hacer echo $dinero
public function __toString(): string
{
$simbolo = match($this->divisa) {
'USD' => '$',
'EUR' => '€',
'COP' => 'COL$',
default => $this->divisa . ' '
};
return $simbolo . number_format($this->cantidad, 2) . " " . $this->divisa;
}
// 2. __clone(): Se dispara al hacer clone $dinero
public function __clone()
{
echo "<p style='color:#6366f1; font-size:12px;'> [__clone] Se ha generado una copia exacta e independiente en memoria.</p>";
}
public function sumar(float $monto): void
{
$this->cantidad += $monto;
}
}
// 3. __invoke(): Objeto ejecutable como función (Action Class)
final class AplicarDescuentoAction
{
public function __invoke(float $precio, float $porcentaje): float
{
$descuento = $precio * ($porcentaje / 100);
return round($precio - $descuento, 2);
}
}
// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
$precioOriginal = new Dinero(150.00, 'USD');
// Demostración de __toString():
echo "<h3>1. Impresión directa de objeto con __toString():</h3>";
echo "<p>Precio actual: <strong>{$precioOriginal}</strong></p>"; // PHP llama a __toString() aquí
// Demostración de __clone():
echo "<h3>2. Duplicación en memoria con clone:</h3>";
$precioCopia = clone $precioOriginal;
$precioCopia->sumar(50.00);
echo "<p>Precio Original: <strong>{$precioOriginal}</strong></p>";
echo "<p>Precio Copia Modificado: <strong>{$precioCopia}</strong></p>";
// Demostración de __invoke():
echo "<h3>3. Objeto invocable como función con __invoke():</h3>";
$calculador = new AplicarDescuentoAction();
$precioConDescuento = $calculador(150.00, 20); // Invocación directa: $calculador()
echo "<p>Precio con 20% de descuento: <strong>\${$precioConDescuento} USD</strong></p>";
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿Qué método mágico de PHP se ejecuta automáticamente cuando intentas imprimir un objeto directamente con echo o concatenarlo como un string?
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar Manual de Programación Orientada a Objetos en PHP (POO) y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.