Menu
Coddy logo textTech

Propiedades de solo lectura (PHP 8.1)

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 19 de 91.

PHP 8.1 introdujo las propiedades readonly, que solo pueden asignarse una vez y no pueden modificarse después. A diferencia de las constantes, las propiedades readonly se establecen durante la inicialización del objeto en lugar de en el momento de la definición de la clase.

Declaras una propiedad de solo lectura añadiendo la palabra clave readonly antes de la declaración del tipo:

<?php
class User {
    public readonly string $id;
    public readonly string $name;
    
    public function __construct(string $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;

Salida:

U001
Alice

Una vez asignada, intentar cambiar una propiedad readonly provocará un error. Esto las hace perfectas para valores que deben permanecer constantes durante toda la vida de un objeto, como IDs o marcas de tiempo de creación.

Las propiedades readonly deben tener una declaración de tipo y solo pueden ser asignadas una vez, desde dentro de la clase que las declara (normalmente en el constructor). A diferencia de las propiedades normales, no se les puede asignar un valor por defecto en la declaración. Funcionan con cualquier modificador de visibilidad:

<?php
class Product {
    public function __construct(
        public readonly string $sku,
        private readonly float $cost
    ) {}
    
    public function getCost(): float {
        return $this->cost;
    }
}

$product = new Product("ABC123", 29.99);
echo $product->sku;

Resultado:

ABC123

Punto clave: Las propiedades readonly proporcionan inmutabilidad a nivel de propiedad. Son ideales para datos que identifican un objeto o que no deberían cambiar después de su creación, combinando la flexibilidad de la inicialización en tiempo de ejecución con la seguridad de prevenir modificaciones accidentales.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de configuración inmutable que utiliza propiedades readonly para asegurar que los ajustes críticos no puedan ser cambiados accidentalmente después de la inicialización.

Crearás dos archivos que trabajan juntos para gestionar la configuración de la aplicación:

  • Config.php — Define una clase Config que represente la configuración de la aplicación con ajustes inmutables. La clase debe tener tres propiedades readonly públicas: string $appName, string $version, e int $maxConnections. Utiliza la promoción de constructor para declarar e inicializar las tres propiedades readonly en una única y limpia definición de constructor. Añade un método getInfo() que devuelva un string con el formato "[appName] v[version] (max: [maxConnections] connections)".
  • main.php — Incluye el archivo de la clase Config. Recibirás tres entradas: el nombre de la aplicación, la versión y las conexiones máximas (como un string que necesita ser convertido a un entero). Crea un objeto Config utilizando estos valores. Imprime el resultado de getInfo() en la primera línea. Luego imprime cada propiedad readonly en su propia línea accediendo a ellas directamente: el nombre de la aplicación, la versión y las conexiones máximas.

Las propiedades readonly aseguran que una vez creada una configuración, sus valores queden bloqueados en su lugar — perfecto para ajustes que deben permanecer constantes durante el tiempo de ejecución de tu aplicación. Observa cómo la promoción de constructor combinada con readonly crea una forma muy concisa de definir objetos de valor inmutables.

Tu salida debe mostrar el string de información formateado seguido de cada valor de propiedad individual, demostrando que las propiedades readonly aún pueden ser leídas desde fuera de la clase.

Pruébalo tú mismo

<?php

require_once 'Config.php';

// Leer entradas
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));

// TODO: Create un objeto Config usando los valores de entrada

// TODO: Imprime el resultado de getInfo()

// TODO: Imprime cada propiedad readonly en su propia línea:
// - app name
// - version
// - max connections

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