Menu
Coddy logo textTech

Público, Protegido, Privado

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 38 de 91.

¡Bienvenido al capítulo de Encapsulamiento! El encapsulamiento consiste en controlar el acceso a los datos internos de su clase. PHP proporciona tres modificadores de acceso que determinan desde dónde se puede acceder a las propiedades y métodos: public, protected y private.

Así es como funciona cada modificador:

<?php
class BankAccount {
    public $accountHolder;    // Accesible desde cualquier lugar
    protected $accountNumber; // Accesible en esta clase y clases hijas
    private $balance;         // Accesible solo en esta clase
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);

echo $account->accountHolder . "\n";  // Funciona - público
echo $account->getBalance();          // Funciona - método público

Salida:

John
1000

Intentar acceder a $account->balance directamente causaría un error porque es privado. Lo mismo se aplica a $account->accountNumber desde fuera de la jerarquía de clases. Esta protección garantiza que los datos sensibles solo puedan modificarse a través de métodos controlados.

ModificadorMisma claseClase hijaFuera
public
protectedNo
privateNoNo

Punto clave: Utiliza private para datos internos que no deberían ser accedidos directamente, protected para datos que las clases hijas necesitan, y public solo para un acceso externo seguro.

challenge icon

Desafío

Fácil

Vamos a construir un sistema seguro de gestión de empleados que demuestre cómo los modificadores de acceso protegen los datos sensibles. Crearás una jerarquía de clases donde diferentes niveles de información son accesibles dependiendo de dónde se esté ejecutando el código: dentro de la clase, en una clase hija o desde el exterior.

Organizarás tu código en tres archivos:

  • Employee.php — Crea una clase Employee que gestione los datos de los empleados con los niveles de visibilidad adecuados. La clase debe tener:
    • Una propiedad public $name para el nombre del empleado (seguro para que cualquiera lo vea)
    • Una propiedad protected $employeeId para el ID interno (necesario para las clases hijas)
    • Una propiedad private $salary para información sensible de pago (solo esta clase debe acceder a ella directamente)
    El constructor debe aceptar los tres valores y asignarlos. Añade un método público getSalary() que devuelva el salario privado; esta es la forma controlada de acceder a datos protegidos. También añade un método público getPublicInfo() que devuelva "[name] works here".
  • Manager.php — Crea una clase Manager que extienda de Employee. Incluye el archivo Employee. El constructor debe aceptar name, employeeId, salary y un nombre de departamento. Llama al constructor padre con los tres primeros valores, luego almacena el departamento en una propiedad privada. Añade un método público getTeamInfo() que devuelva "Manager [name] (ID: [employeeId]) leads [department]". Observa cómo la clase hija puede acceder al $employeeId protegido pero necesitaría getSalary() para acceder al salario privado.
  • main.php — Incluye el archivo Manager. Recibirás cuatro entradas: un nombre, un ID de empleado, un salario (como una cadena que convertirás a entero) y un nombre de departamento. Crea una instancia de Manager con estos valores. Imprime tres líneas:
    • El nombre del gerente accedido directamente (propiedad pública)
    • El resultado de llamar a getTeamInfo()
    • El resultado de llamar a getSalary()

Este desafío muestra la encapsulación en acción: el nombre es libremente accesible, el ID del empleado se comparte con las clases hijas a través de la visibilidad protegida, y el salario permanece bloqueado en la clase padre, accesible solo a través de un método público controlado.

Hoja de referencia

PHP proporciona tres modificadores de acceso para controlar dónde se puede acceder a las propiedades y métodos:

ModificadorMisma claseClase hijaFuera
public
protectedNo
privateNoNo

Ejemplo:

<?php
class BankAccount {
    public $accountHolder;    // Accesible desde cualquier lugar
    protected $accountNumber; // Accesible en esta clase y clases hijas
    private $balance;         // Accesible solo en esta clase
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder;  // Funciona - público
echo $account->getBalance();   // Funciona - método público

Mejores prácticas:

  • Use private para datos internos a los que no se debe acceder directamente
  • Use protected para datos que las clases hijas necesiten
  • Use public solo para un acceso externo seguro

Pruébalo tú mismo

<?php
require_once 'Manager.php';

// Leer entradas
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));

// TODO: Crear una instancia de Manager con los valores de entrada

// TODO: Imprimir el nombre del gerente (accedido directamente como propiedad pública)

// TODO: Imprimir el resultado de llamar a getTeamInfo()

// TODO: Imprimir el resultado de llamar a getSalary()
?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos