Clases, Propiedades Tipadas, Métodos y Encapsulamiento (Visibilidad)
Aprende a proteger el estado interno de tus objetos mediante los modificadores public, private y protected, y utiliza getters y setters para validar datos.
El Principio de Encapsulamiento
El encapsulamiento es el primer gran pilar de la Programación Orientada a Objetos. Establece que los datos internos de un objeto (sus propiedades) deben estar protegidos de accesos directos o modificaciones accidentales desde el exterior.
Imagina el motor de un automóvil: el conductor interactúa con el volante y los pedales (la interfaz pública), pero no manipula directamente los pistones con las manos mientras el auto avanza (los detalles internos privados).
Modificadores de Visibilidad en PHP
PHP proporciona tres palabras clave para controlar el acceso a propiedades, métodos y constantes:
| Modificador | ¿Desde la propia Clase? | ¿Desde Subclases (Hijas)? | ¿Desde el Código Exterior? |
|---|---|---|---|
public |
✔ Sí | ✔ Sí | ✔ Sí (Acceso Total) |
protected |
✔ Sí | ✔ Sí (Herencia) | ❌ No (Bloqueado) |
private |
✔ Sí (Solo ella) | ❌ No (Bloqueado) | ❌ No (Bloqueado) |
Getters y Setters: Controlando el Flujo de Datos
Al marcar las propiedades como private, evitamos que código externo asigne valores ilógicos como $cuenta->saldo = -50000;.
Para leer o modificar de forma controlada estos valores, implementamos métodos públicos conocidos como:
- Getters (ej: `getSaldo()`): Métodos de solo lectura que retornan el valor protegido o una versión formateada.
- Setters (ej: `setPin(string $pin)`): Métodos que validan las reglas de negocio antes de alterar el valor.
⚡ Cuenta Bancaria con Encapsulamiento y Validación Estricta
Ejecuta el código en el Sandbox y prueba qué ocurre al intentar retirar más dinero del disponible:
<?php
declare(strict_types=1);
class CuentaBancaria
{
// Propiedades privadas: Nadie puede tocarlas directamente desde fuera
private string $titular;
private float $saldo;
private string $numeroCuenta;
// Métodos públicos (La interfaz segura)
public function inicializar(string $titular, string $numeroCuenta, float $saldoInicial = 0.0): void
{
$this->titular = trim($titular);
$this->numeroCuenta = $numeroCuenta;
$this->saldo = max(0.0, $saldoInicial);
}
// Getter para leer el titular
public function getTitular(): string
{
return $this->titular;
}
// Getter para leer el saldo
public function getSaldo(): float
{
return $this->saldo;
}
// Operación de negocio con validación
public function depositar(float $monto): void
{
if ($monto <= 0) {
echo "<p style='color:red;'>⚠️ Error: El monto a depositar debe ser positivo.</p>";
return;
}
$this->saldo += $monto;
echo "<p style='color:green;'> Depósito exitoso de $" . number_format($monto, 2) . "</p>";
}
// Operación de retiro blindada contra sobregiros
public function retirar(float $monto): bool
{
if ($monto <= 0) {
echo "<p style='color:red;'>⚠️ Error: Monto inválido.</p>";
return false;
}
if ($monto > $this->saldo) {
echo "<p style='color:#dc2626; font-weight:bold;'>❌ Fondos insuficientes. Intento de retirar $" . number_format($monto, 2) . " con saldo disponible de $" . number_format($this->saldo, 2) . "</p>";
return false;
}
$this->saldo -= $monto;
echo "<p style='color:#16a34a;'> Retiro de $" . number_format($monto, 2) . " aprobado. Nuevo saldo: $" . number_format($this->saldo, 2) . "</p>";
return true;
}
}
// ==========================================
// PRUEBA DEL ENCAPSULAMIENTO
// ==========================================
$miCuenta = new CuentaBancaria();
$miCuenta->inicializar("Mariana Velásquez", "ES91-2100-0418", 1000.00);
echo "<h2>Cuenta de: " . htmlspecialchars($miCuenta->getTitular()) . "</h2>";
echo "<p>Saldo inicial: $" . number_format($miCuenta->getSaldo(), 2) . "</p>";
// Transacciones
$miCuenta->depositar(350.00);
$miCuenta->retirar(400.00);
$miCuenta->retirar(2000.00); // Intento fallido bloqueado por la lógica de negocio
echo "<h3>Saldo Final Protegido: $" . number_format($miCuenta->getSaldo(), 2) . "</h3>";
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿Qué modificador de visibilidad impide que una propiedad sea leída o modificada directamente desde el código exterior fuera de la clase?
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar Manual de Programación Orientada a Objetos en PHP (POO) y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.