Menu
Coddy logo textTech

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
25

El 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.

challenge icon

Desafío

Fácil

Construyamos 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 clase Product con 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 propiedad
    • setPrice() solo debe aceptar valores mayores que 0: rechaza los precios cero o negativos
    • setStock() solo debe aceptar valores de 0 o mayores: rechaza las cantidades de stock negativas
    Cada getter debe simplemente devolver el valor de la propiedad correspondiente. Añade un método público 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 de Product y utiliza los setters para asignar el nombre inicial, el precio (convertido a flotante) y el stock (convertido a entero). Imprime el resultado de getInfo(). Después, intenta actualizar el precio con el nuevo valor (convertido a flotante) e imprime getInfo() nuevamente. Por último, intenta establecer el stock en -5 (un valor no válido) e imprime getInfo() 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

?>
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