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 sobre encapsulación! La encapsulación consiste en controlar el acceso a los datos internos de tu clase. PHP proporciona tres modificadores de acceso que determinan desde dónde se puede acceder a las propiedades y los 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 en las 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 - public
echo $account->getBalance(); // Funciona - método public
Salida:
John
1000Intentar acceder directamente a $account->balance provocarí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 confidenciales solo puedan modificarse mediante métodos controlados.
| Modificador | Misma clase | Clase hija | Fuera |
|---|---|---|---|
public | Sí | Sí | Sí |
protected | Sí | Sí | No |
private | Sí | No | No |
Punto clave: Usa private para los datos internos a los que no se debería acceder directamente, protected para los datos que necesitan las clases secundarias y public solo para un acceso externo seguro.
Desafío
FácilConstruyamos un sistema seguro de gestión de empleados que demuestre cómo los modificadores de acceso protegen los datos confidenciales. Crearás una jerarquía de clases en la que se pueda acceder a distintos niveles de información dependiendo de dónde se ejecute el código: dentro de la clase, en una clase hija o desde fuera.
Organizarás tu código en tres archivos:
Employee.php: Crea una claseEmployeeque gestione los datos de los empleados con niveles de visibilidad adecuados. La clase debe tener:- Una propiedad
public$namepara el nombre del empleado (es seguro que cualquiera pueda verlo) - Una propiedad
protected$employeeIdpara el ID interno (necesario para las clases hijas) - Una propiedad
private$salarypara la información salarial confidencial (solo esta clase debe acceder a ella directamente)
getSalary()que devuelva el salario privado. Esta es la forma controlada de acceder a los datos protegidos. Añade también un método públicogetPublicInfo()que devuelva"[name] works here".- Una propiedad
Manager.php: Crea una claseManagerque extiendaEmployee. Incluye el archivo de Employee. El constructor debe aceptar el nombre, employeeId, salario y nombre de un departamento. Llama al constructor padre con los tres primeros valores y, después, guarda el departamento en una propiedad privada. Añade un método públicogetTeamInfo()que devuelva"Manager [name] (ID: [employeeId]) leads [department]". Observa cómo la clase hija puede acceder a$employeeId, que está protegido, pero necesitaríagetSalary()para acceder al salario privado.main.php: Incluye el archivo de Manager. Recibirás cuatro entradas: un nombre, un ID de empleado, un salario (como una cadena que convertirás en un entero) y un nombre de departamento. Crea una instancia deManagercon 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 accesible libremente, el ID de empleado se comparte con las clases hijas mediante la visibilidad protegida y el salario permanece protegido en la clase padre: solo se puede acceder a él mediante un método público controlado.
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: Crea una instancia de Manager con los valores de entrada
// TODO: Imprime el nombre del manager (accedido directamente como propiedad pública)
// TODO: Imprime el resultado de llamar a getTeamInfo()
// TODO: Imprime el resultado de llamar a 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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online