Encapsulamiento de objetos en PHP
Bienvenido a una nueva lección de nuestro curso básico de PHP 8. Hoy nos metemos con el encapsulamiento, un pilar clave de la programación orientada a objetos (POO) que te ayuda a mantener tus datos seguros y tu código limpio. Si ya manejas clases y polimorfismo, esto es el toque final para brillar. Todo va a ser claro, práctico y con ejemplos que te van a flipar. ¡Empecemos!
¿Qué es el encapsulamiento?
El encapsulamiento es como poner un candado en tus objetos: escondes los detalles internos (como las propiedades sensibles) y solo dejas ver lo que otros necesitan usar (a través de métodos). Esto protege tu código de cambios no deseados y hace que sea más fácil de entender y mantener.
En PHP, controlas el encapsulamiento con tres niveles de acceso:
public: Cualquiera puede tocarlo, desde dentro o fuera de la clase.protected: Solo la clase y sus hijas (herencia) pueden acceder.private: Solo la clase misma puede usarlo; ni las hijas lo ven.
La receta básica es esta:
class MiClase {
public $publico;
protected $protegido;
private $privado;
public function metodoPublico() { /* Código */ }
protected function metodoProtegido() { /* Código */ }
private function metodoPrivado() { /* Código */ }
}
Probando encapsulamiento en acción
¡Manos a la obra! Crea un archivo encapsulamiento.php en curso_php8 (dentro de C:\xampp\htdocs) y prueba esto:
Ejemplo 1: Clase con diferentes accesos
<?php
class MiClase {
public $valor1 = "Público";
protected $valor2 = "Protegido";
private $valor3 = "Privado";
public function imprimirValorPublico() {
echo "Valor público: $this->valor1<br>";
}
public function imprimirValorProtegido() {
echo "Valor protegido: $this->valor2<br>";
}
public function imprimirValorPrivado() {
echo "Valor privado: $this->valor3<br>";
}
}
class MiClase2 extends MiClase {
public function imprimirValorProtegido2() {
echo "Desde la hija: $this->valor2<br>";
}
}
$valor = new MiClase();
echo "Accediendo directamente: $valor->valor1<br>";
// echo $valor->valor2; // ¡Error! Es protegido
// echo $valor->valor3; // ¡Error! Es privado
$valor->imprimirValorPublico();
$valor->imprimirValorProtegido();
$valor->imprimirValorPrivado();
$valor2 = new MiClase2();
$valor2->imprimirValorProtegido2();
?>
Abre http://localhost/curso_php8/encapsulamiento.php. Verás:
Accediendo directamente: Público Valor público: Público Valor protegido: Protegido Valor privado: Privado Desde la hija: Protegido
¿Qué pasó?
$valor1espublic, así que lo accedimos directamente.$valor2esprotected, solo lo vimos a través de un método o en la clase hija.$valor3esprivate, solo lo tocamos con un método deMiClase.- La clase hija
MiClase2accedió a$valor2porque esprotected.
Ejemplo práctico
Ejemplo: Clase Estudiante
<?php
class Estudiante {
private $nombre;
private $nota;
public function __construct($nombre, $nota) {
$this->nombre = $nombre;
$this->nota = $nota;
}
public function getNombre() {
return $this->nombre;
}
public function getNota() {
return $this->nota;
}
public function setNota($nota) {
if ($nota >= 0 && $nota <= 100) {
$this->nota = $nota;
} else {
echo "Nota inválida<br>";
}
}
}
$estudiante = new Estudiante("Ana", 85);
echo "Nombre: " . $estudiante->getNombre() . "<br>";
echo "Nota: " . $estudiante->getNota() . "<br>";
$estudiante->setNota(95);
echo "Nueva nota: " . $estudiante->getNota() . "<br>";
$estudiante->setNota(150); // ¡Error!
?>
Resultado:
Nombre: Ana Nota: 85 Nueva nota: 95 Nota inválida
¿Qué pasó?
$nombrey$notasonprivate, así que nadie los toca directamente.- Usamos métodos
public(getyset) para acceder y validar datos.
Ejercicio para practicar
¡Tu turno de rockearlo! Ve a curso_php8 y prueba este reto:
- Clase CuentaBancaria
Creacuenta_bancaria.php:
<?php
class CuentaBancaria {
private $saldo;
private $titular;
public function __construct($titular, $saldoInicial) {
$this->titular = $titular;
$this->saldo = $saldoInicial;
}
public function getSaldo() {
return $this->saldo;
}
public function getTitular() {
return $this->titular;
}
public function depositar($monto) {
if ($monto > 0) {
$this->saldo += $monto;
echo "Depositado: $monto. Nuevo saldo: $this->saldo<br>";
} else {
echo "Monto inválido<br>";
}
}
public function retirar($monto) {
if ($monto > 0 && $monto <= $this->saldo) {
$this->saldo -= $monto;
echo "Retirado: $monto. Nuevo saldo: $this->saldo<br>";
} else {
echo "Retiro inválido<br>";
}
}
}
$cuenta = new CuentaBancaria("Juan Pérez", 1000);
echo "Titular: " . $cuenta->getTitular() . "<br>";
echo "Saldo inicial: " . $cuenta->getSaldo() . "<br>";
$cuenta->depositar(500);
$cuenta->retirar(200);
$cuenta->retirar(2000); // ¡Error!
?>
Ejecuta en localhost/curso_php8/ y juega con los valores.
Consejos para no enredarte
- Usa
privatepor defecto: Solo hazpubliclo que otros realmente necesitan. - Getters y setters: Métodos como
getNombre()osetNota()son tus aliados para controlar el acceso. - Valida siempre: En métodos como
setodepositar, revisa que los datos sean correctos.
¡A por más POO!
¡Gran trabajo, máquina! Ahora el encapsulamiento es tu escudo para proteger datos y escribir código robusto. En la próxima lección, veremos clases abstractas para definir contratos claros en tus programas. Si algo no te queda claro, déjame un comentario.
Lo que aprendiste hoy:
- Qué es: Esconder detalles internos y mostrar solo lo necesario.
public,protected,private: Tus herramientas para controlar el acceso.- Ejemplos vivos: Jugaste con clases y herencia para ver quién toca qué.
- Practicaste: Creaste una cuenta bancaria blindada como pro.
- Tip del pro: Usa
privatey métodosget/setpara mantener todo bajo control.

