Tema 10 · Métodos Mágicos

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:

Dinero.php
Solo lectura
<?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>";
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿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.