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:
100Intentar 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.comPunto 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.
Desafío
FácilVamos 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 claseEmployeeque sirva como base para todos los empleados. Debe tener una propiedadprotected $name(para que las clases hijas puedan acceder a ella) y una propiedadprivate $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úblicogetName()que devuelva el nombre, un método públicogetSalary()que devuelva el salario y un método públicogiveRaise($amount)que aumente el salario en la cantidad dada.Manager.php— Define una claseManagerque extienda deEmployee. 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étodogetDetails()que devuelva"[name] manages [department]"accediendo directamente a la propiedad protegida$name. También añade un métodogetDepartment()que devuelva el departamento.main.php— Incluye ambos archivos de clase. Crea unManagercon el nombre"Sarah", salario75000y departamento"Engineering". Imprime los detalles del gerente usandogetDetails(). Luego, dale al gerente un aumento de5000e imprime su nuevo salario usandogetSalary(). 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 lugarprivate— accesible solo dentro de la clase que lo defineprotected— 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
privatecuando solo la clase que lo define deba acceder a la propiedad - Use
protectedcuando 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()
?>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
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy