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