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:
¡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
extendsreutiliza código de otra claseparent::llama al método del padre
💪 Ejercicio Práctico
Amplía la clase Producto
- Añade un método
estaEnStock(): boolque devuelva si$stock > 0. - Crea una segunda clase hija
ProductoOferta extends Productoque aplique un 15% de descuento automáticamente en el constructor. - Añade una interfaz
Facturablecon un métodocalcularFactura()e impleméntala enProducto.
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;
}
}