Getters y setters
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 40 de 91.
Ahora que entiendes los modificadores de acceso, ¿cómo interactúas de forma segura con las propiedades privadas desde fuera de la clase? La respuesta son los getters y setters: métodos públicos que proporcionan un acceso controlado a los datos privados.
Un getter recupera el valor de una propiedad, mientras que un setter lo modifica. Este patrón te permite añadir validación o lógica cuando se accede a los datos o se modifican:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail() . "\n";
echo $user->getAge();
Salida:
john@example.com
25El setter valida el formato del correo electrónico y garantiza que la edad sea razonable antes de almacenar los valores. Sin setters, cualquiera podría asignar datos no válidos directamente. También puedes crear propiedades de solo lectura proporcionando únicamente un getter, o propiedades de solo escritura con solo un setter.
Punto clave: Los getters y setters te permiten controlar cómo se accede a los datos privados y cómo se modifican, lo que permite realizar validaciones, aplicar formatos o usar cualquier lógica personalizada.
Desafío
FácilConstruyamos un sistema de inventario de productos que utilice getters y setters para proteger y validar los datos de los productos. Crearás una clase Product que garantiza que los precios sean siempre positivos y que las cantidades en stock nunca sean negativas: demostrando cómo los setters pueden hacer cumplir las reglas de negocio.
Organizarás tu código en dos archivos:
Product.php: Crea una claseProductcon tres propiedades privadas:$name(cadena),$price(flotante) y$stock(entero). Implementa getters y setters para cada propiedad con las siguientes reglas de validación:setName()solo debe aceptar cadenas no vacías; si la cadena está vacía después de eliminar los espacios, no actualices la propiedadsetPrice()solo debe aceptar valores mayores que 0: rechaza los precios cero o negativossetStock()solo debe aceptar valores de 0 o mayores: rechaza las cantidades de stock negativas
getInfo()que devuelva"[name]: $[price] ([stock] in stock)"con el precio formateado con 2 decimales.main.php: Incluye el archivo Product. Recibirás cuatro entradas: un nombre de producto, un precio, una cantidad de stock y un nuevo precio para actualizar. Crea una instancia deProducty utiliza los setters para asignar el nombre inicial, el precio (convertido a flotante) y el stock (convertido a entero). Imprime el resultado degetInfo(). Después, intenta actualizar el precio con el nuevo valor (convertido a flotante) e imprimegetInfo()nuevamente. Por último, intenta establecer el stock en-5(un valor no válido) e imprimegetInfo()una vez más para confirmar que el stock no cambió.
Tus setters actúan como guardianes. Validan los datos recibidos antes de permitir cambios en las propiedades privadas. Cuando se pasan datos no válidos (como un stock negativo), el setter simplemente los ignora y conserva intacto el valor válido existente. Este es el poder de la encapsulación: tu objeto mantiene su integridad independientemente de lo que el código externo intente hacer.
Pruébalo tú mismo
<?php
require_once 'Product.php';
// Leer entradas
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: Crea una nueva instancia de Product
// TODO: Usa setters para asignar el name inicial, price (como float) y stock (como integer)
// TODO: Imprime el resultado de getInfo()
// TODO: Actualiza el price con newPrice (como float) e imprime getInfo() de nuevo
// TODO: Intenta establecer stock a -5 (inválido) e imprime getInfo() para confirmar que stock no fue cambiado
?>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