Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
ejemplo.php
Tab = 4 espacios
1
<?php
declare(strict_types=1);

final class Producto
{
    // Constructor Property Promotion + Readonly en PHP 8.2
    public function __construct(
        public readonly int $id,
        public readonly string $codigoSku,
        private string $nombre,
        private float $precio,
        private int $stock = 0
    ) {
        if ($precio < 0) {
            throw new InvalidArgumentException("El precio no puede ser negativo.");
        }
    }

    public function getNombre(): string
    {
        return $this->nombre;
    }

    public function getPrecioConIva(float $iva = 0.21): float
    {
        return round($this->precio * (1 + $iva), 2);
    }

    public function agregarStock(int $cantidad): void
    {
        if ($cantidad > 0) {
            $this->stock += $cantidad;
        }
    }

    public function renderTarjeta(): void
    {
        echo "<div style='font-family:system-ui; border:1px solid #e2e8f0; border-radius:10px; padding:18px; max-width:420px; background:#ffffff; box-shadow:0 4px 6px rgba(0,0,0,0.05); margin-bottom:15px;'>";
        echo "<span style='background:#e0e7ff; color:#3730a3; padding:3px 8px; border-radius:4px; font-size:12px; font-weight:bold;'>SKU: {$this->codigoSku} (ID #{$this->id})</span>";
        echo "<h3 style='margin:10px 0 5px 0; color:#0f172a;'>{$this->nombre}</h3>";
        echo "<p style='margin:0; font-size:18px; font-weight:bold; color:#059669;'>$" . number_format($this->precio, 2) . " <span style='font-size:12px; color:#64748b; font-weight:normal;'>+ IVA: $" . number_format($this->getPrecioConIva(), 2) . "</span></p>";
        echo "<p style='margin:8px 0 0 0; color:#64748b; font-size:13px;'>Disponibles en almacén: <strong>{$this->stock}</strong> unidades</p>";
        echo "</div>";
    }
}

// Instanciación directa y segura con el constructor
$prod1 = new Producto(101, "KB-MAC-01", "MacBook Pro M3 Max", 2499.00, 15);
$prod2 = new Producto(102, "KB-LOGI-MX", "Mouse Logitech MX Master 3S", 99.90, 42);

echo "<h2>Catálogo de Productos (PHP 8 Constructor Promotion):</h2>";
$prod1->renderTarjeta();
$prod2->renderTarjeta();

// Demostración de protección readonly:
// $prod1->id = 999; // ❌ Descomentar esto lanzaría: Cannot modify readonly property
Haz clic para editar este código
Vista Previa
Servidor PHP 8.3