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