Tema 2 · Encapsulamiento

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:

CuentaBancaria.php
Solo lectura
<?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>";
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿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.