Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
ejemplo.php
Tab = 4 espacios
1
<?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>";
Haz clic para editar este código
Vista Previa
Servidor PHP 8.3