Public, Private y Protected en PHP: guía de encapsulación

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Public, Private y Protected en PHP: ¿por qué sin ellos tu código es un caos?

\n\n

Imagina que estás construyendo una casa. Tienes una puerta principal (todos pueden entrar), un dormitorio con cerradura (solo para la familia) y una caja fuerte en la pared (solo tú tienes acceso). En el mundo de la programación orientada a objetos (POO) en PHP, esas «puertas» y «cerraduras» se llaman modificadores de acceso.

\n\n

Si alguna vez has escrito clases en PHP, seguro te has topado con las palabras public, private y protected. Pero, ¿qué significan realmente? ¿Por qué no puedes hacer todo public y vivir tranquilo? La respuesta es simple: sin ellos, tu código se convierte en un patio de recreo donde cualquier script puede romper la lógica del programa accidentalmente.

\n\n

En este artículo, exploraremos los modificadores de acceso en PHP con ejemplos prácticos, entenderemos la diferencia entre ellos y aprenderemos a usarlos para crear código robusto y flexible. Esta guía se basa en una pregunta popular de Stack Overflow y está adaptada para el sitio educativo pythonlib.ru.

\n\n

¿Qué son los modificadores de acceso y para qué sirven?

\n\n

Los modificadores de acceso son palabras clave que determinan desde dónde se puede acceder a las propiedades y métodos de una clase. Son la base de la encapsulación (uno de los cuatro pilares de la POO). La encapsulación oculta el funcionamiento interno del objeto y protege los datos de un uso incorrecto.

\n\n

En PHP existen tres niveles de acceso:

\n\n
    \n
  • Public — accesible desde cualquier lugar (dentro y fuera de la clase).
  • \n
  • Private — accesible solo dentro de la propia clase.
  • \n
  • Protected — accesible dentro de la clase y en las clases heredadas.
  • \n
\n\n

Analicemos cada uno con ejemplos prácticos.

\n\n

Public: «Entrada sin llamar»

\n\n

El modificador public es el más abierto. Las propiedades y métodos declarados como public se pueden leer y modificar desde cualquier lugar: desde otra clase, desde un script global, desde el espacio exterior (es broma).

\n\n
<?php\nclass Coche {\n    public $marca = 'Toyota';\n\n    public function pitar() {\n        return '¡Piiii!';\n    }\n}\n\n$miCoche = new Coche();\necho $miCoche->marca; // Toyota — funciona\n$miCoche->marca = 'Honda'; // Lo cambiamos — funciona\necho $miCoche->pitar(); // ¡Piiii!\n?>
\n\n

¿Parece cómodo, verdad? Pero hay un problema. Imagina que la clase Usuario tiene una propiedad public $contraseña. Cualquier código externo podría leerla y modificarla. Esto es un desastre para la seguridad.

\n\n

¿Cuándo usarlo? Para métodos que forman parte de la API pública de la clase (por ejemplo, obtenerNombreUsuario()), o para constantes.

\n\n

Private: «La caja fuerte que no se puede abrir»

\n\n

El modificador private es todo lo contrario a public. Una propiedad o método es accesible solo dentro de la clase donde se declara. Ni siquiera las clases heredadas pueden ver los miembros private del padre.

\n\n
<?php\nclass CuentaBancaria {\n    private $saldo = 1000;\n\n    private function calcularInteres() {\n        return $this->saldo * 0.05;\n    }\n\n    public function obtenerSaldo() {\n        return $this->saldo;\n    }\n\n    public function aplicarInteres() {\n        $this->saldo += $this->calcularInteres();\n    }\n}\n\n$cuenta = new CuentaBancaria();\n// echo $cuenta->saldo; // ¡Error! No se puede acceder a propiedad private\n// echo $cuenta->calcularInteres(); // ¡Error! No se puede acceder a método private\necho $cuenta->obtenerSaldo(); // 1000 — funciona, porque el método es public\n$cuenta->aplicarInteres();\necho $cuenta->obtenerSaldo(); // 1050\n?>
\n\n

En este ejemplo, $saldo y calcularInteres() están ocultos del mundo exterior. Gestionamos el saldo solo a través de los métodos públicos obtenerSaldo() y aplicarInteres(). Esto es la encapsulación en acción.

Blogs

Book Recommendations