POO en PHP: Clases, Objetos y Herencia

Crea un objeto "Producto" y observa cómo sus métodos transforman sus propios datos

🎯 Demo en Vivo

Objeto instanciado:

resumen()
Teclado mecánico: 12 unidades a 45€/ud.
precioConIva(21)
54.45 €
aplicarDescuento(10)
Nuevo precio: 40.5 €
Clase usada
Producto

¡Crea tu propio producto!

📖 Explicación del Código

Definición de la clase

class Producto {
    protected string $nombre;
    protected float $precio;
    protected int $stock;

    public function __construct(string $nombre, float $precio, int $stock) {
        $this->nombre = $nombre;
        $this->precio = $precio;
        $this->stock  = $stock;
    }

    public function precioConIva(float $iva = 21): float {
        return round($this->precio * (1 + $iva / 100), 2);
    }

    public function aplicarDescuento(float $porcentaje): float {
        $this->precio -= $this->precio * $porcentaje / 100;
        return round($this->precio, 2);
    }
}

📝 Propiedades y protected

¿Qué hace? Declara los datos que cada objeto "Producto" guardará. Al ser protected, solo la propia clase (o sus hijas) puede modificarlas directamente — es encapsulación.

💡 Concepto: Encapsulación

public: accesible desde cualquier parte.
protected: accesible desde la clase y sus hijas.
private: solo accesible desde la propia clase.

📝 El constructor __construct()

¿Qué hace? Se ejecuta automáticamente al crear un objeto con new Producto(...), inicializando sus propiedades.

📝 Herencia con extends

class ProductoDigital extends Producto {
    private float $tamanioMB;

    public function __construct(string $nombre, float $precio, int $stock, float $tamanioMB) {
        parent::__construct($nombre, $precio, $stock);
        $this->tamanioMB = $tamanioMB;
    }

    public function resumen(): string {
        return parent::resumen() . " (descarga digital, {$this->tamanioMB} MB)";
    }
}

¿Qué hace? ProductoDigital reutiliza todo lo de Producto y sobreescribe resumen(), llamando a la versión del padre con parent::resumen() y añadiendo información extra.

💡 Concepto: Herencia y polimorfismo

Cuando marcas la casilla "Es un producto digital", el mismo código que llama a $producto->resumen() ejecuta una versión distinta según la clase real del objeto — eso es polimorfismo.

🎯 Conceptos Clave

Clase

  • Plantilla que define propiedades y métodos
  • No ocupa memoria hasta instanciarla

Objeto

  • Instancia concreta de una clase (new)
  • Cada objeto tiene sus propios valores

Herencia

  • extends reutiliza código de otra clase
  • parent:: llama al método del padre

💪 Ejercicio Práctico

Amplía la clase Producto

  1. Añade un método estaEnStock(): bool que devuelva si $stock > 0.
  2. Crea una segunda clase hija ProductoOferta extends Producto que aplique un 15% de descuento automáticamente en el constructor.
  3. Añade una interfaz Facturable con un método calcularFactura() e impleméntala en Producto.

Solución 1

public function estaEnStock(): bool {
    return $this->stock > 0;
}

Solución 2

class ProductoOferta extends Producto {
    public function __construct(string $nombre, float $precio, int $stock) {
        parent::__construct($nombre, $precio, $stock);
        $this->aplicarDescuento(15);
    }
}

Solución 3

interface Facturable {
    public function calcularFactura(): float;
}

class Producto implements Facturable {
    // ...
    public function calcularFactura(): float {
        return $this->precioConIva() * $this->stock;
    }
}