Menu
Coddy logo textTech

Propiedades privadas y protegidas

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 18 de 91.

Hasta ahora, hemos usado propiedades public a las que se puede acceder desde cualquier lugar. Pero a veces necesitas restringir el acceso para proteger tus datos. PHP proporciona dos modificadores de visibilidad adicionales: private y protected.

Una propiedad private solo puede ser accedida desde dentro de la clase que la define:

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

Salida:

100

Intentar acceder directamente a $account->balance desde fuera de la clase provocaría un error. Esto protege el saldo para que no se modifique sin pasar por el método deposit.

Una propiedad protected funciona de manera similar, pero también pueden acceder a ella las clases hijas que extienden la clase principal:

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

Salida:

admin@example.com

Punto clave: Usa private cuando solo la clase que define la propiedad deba acceder a ella. Usa protected cuando las clases hijas también necesiten acceder a ella. Ambos impiden el acceso externo directo, manteniendo seguro el estado interno de tu objeto.

challenge icon

Desafío

Fácil

Construyamos un sistema seguro de gestión de empleados que demuestre cómo proteger datos confidenciales mediante propiedades privadas y protegidas.

Crearás tres archivos que funcionan conjuntamente para gestionar la información de los empleados con un control de acceso adecuado:

  • Employee.php: Define una clase Employee que sirve como base para todos los empleados. Debe tener una propiedad protected $name (para que las clases hijas puedan acceder a ella) y una propiedad private $salary (solo esta clase debe modificar los salarios directamente). El constructor acepta un nombre y un salario, y establece ambas propiedades. Añade un método público getName() que devuelve el nombre, un método público getSalary() que devuelve el salario y un método público giveRaise($amount) que aumenta el salario en la cantidad indicada.
  • Manager.php: Define una clase Manager que extiende Employee. Incluye el archivo Employee al principio. Añade una propiedad privada $department. El constructor debe aceptar el nombre, el salario y el departamento: llama al constructor de la clase padre con parent::__construct($name, $salary) y después establece el departamento. Crea un método getDetails() que devuelva "[name] manages [department]" accediendo directamente a la propiedad protegida $name. Añade también un método getDepartment() que devuelva el departamento.
  • main.php: Incluye ambos archivos de clase. Crea un Manager con el nombre "Sarah", el salario 75000 y el departamento "Engineering". Imprime los detalles del gerente usando getDetails(). Después, dale al gerente un aumento de 5000 e imprime su nuevo salario usando getSalary(). Cada salida debe aparecer en su propia línea.

Observa cómo la clase Manager puede acceder directamente a la propiedad protegida $name, pero debe usar el método getSalary() para acceder al salario privado. Esto demuestra la diferencia clave entre la visibilidad protegida y privada: la protegida permite el acceso de las clases hijas, mientras que la privada mantiene los datos verdaderamente ocultos.

Pruébalo tú mismo

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: Crea un Manager con nombre "Sarah", salario 75000 y departamento "Engineering"

// TODO: Imprime los detalles del manager usando getDetails()

// TODO: Dale al manager un aumento de 5000

// TODO: Imprime el nuevo salario usando 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

Practica por tu cuenta: Compilador de PHP online