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 utilizado propiedades public que pueden ser accedidas 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 a $account->balance directamente desde fuera de la clase causaría un error. Esto protege el saldo de ser modificado sin pasar por el método deposit.

Una propiedad protected funciona de manera similar, pero también puede ser accedida por clases hijas que extienden a la clase padre:

<?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 lo define deba acceder a la propiedad. Usa protected cuando las clases hijas también necesiten acceso. Ambos evitan el acceso externo directo, manteniendo seguro el estado interno de tu objeto.

challenge icon

Desafío

Fácil

Vamos a construir un sistema seguro de gestión de empleados que demuestre cómo proteger datos sensibles utilizando propiedades privadas y protegidas.

Crearás tres archivos que trabajan juntos para gestionar la información de los empleados con el control de acceso adecuado:

  • Employee.php — Define una clase Employee que sirva 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 directamente los salarios). El constructor acepta un nombre y un salario, estableciendo ambas propiedades. Añade un método público getName() que devuelva el nombre, un método público getSalary() que devuelva el salario y un método público giveRaise($amount) que aumente el salario en la cantidad dada.
  • Manager.php — Define una clase Manager que extienda de Employee. Incluye el archivo de Employee en la parte superior. Añade una propiedad privada $department. El constructor debe aceptar nombre, salario y departamento — llama al constructor del padre para el nombre y el salario, luego establece el departamento. Crea un método getDetails() que devuelva "[name] manages [department]" accediendo directamente a la propiedad protegida $name. También añade un método getDepartment() que devuelva el departamento.
  • main.php — Incluye ambos archivos de clase. Crea un Manager con el nombre "Sarah", salario 75000 y departamento "Engineering". Imprime los detalles del gerente usando getDetails(). Luego, dale al gerente un aumento de 5000 e imprime su nuevo salario usando getSalary(). Cada salida debe estar 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: lo protegido permite el acceso a la clase hija, mientras que lo privado mantiene los datos verdaderamente ocultos.

Hoja de referencia

PHP proporciona tres modificadores de visibilidad para las propiedades de clase:

  • public — accesible desde cualquier lugar
  • private — accesible solo dentro de la clase que lo define
  • protected — accesible dentro de la clase que lo define y en las clases hijas

Propiedades privadas:

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

Las propiedades privadas no pueden ser accedidas directamente desde fuera de la clase. Utilice métodos públicos para interactuar con ellas.

Propiedades protegidas:

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

class Admin extends User {
    public function showEmail() {
        return $this->email; // La clase hija puede acceder a la propiedad protegida
    }
}

Las propiedades protegidas pueden ser accedidas por clases hijas que extienden la clase padre.

Cuándo usar:

  • Use private cuando solo la clase que lo define deba acceder a la propiedad
  • Use protected cuando las clases hijas también necesiten acceso
  • Ambos evitan el acceso externo directo, protegiendo el estado interno del objeto

Pruébalo tú mismo

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

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

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

// TODO: Darle al manager un aumento de 5000

// TODO: Imprimir 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