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
AliceUna 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 inicializadas una vez, ya sea en el constructor o en el punto de 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:
ABC123Punto 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.
Desafío
FácilVamos a construir un sistema de configuración inmutable que utiliza propiedades readonly para asegurar que los ajustes críticos no puedan cambiarse 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 claseConfigque represente la configuración de la aplicación con ajustes inmutables. La clase debe tener tres propiedades públicasreadonly:string $appName,string $versioneint $maxConnections. Utiliza la promoción de constructor para declarar e inicializar las tres propiedadesreadonlyen una única y limpia definición de constructor. Añade un métodogetInfo()que devuelva una cadena en el formato"[appName] v[version] (max: [maxConnections] connections)".main.php— Incluye el archivo de la claseConfig. Recibirás tres entradas: el nombre de la aplicación, la versión y las conexiones máximas (como una cadena que debe convertirse a un entero). Crea un objetoConfigutilizando estos valores. Imprime el resultado degetInfo()en la primera línea. Luego, imprime cada propiedadreadonlyen 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, lo cual es perfecto para ajustes que deben permanecer constantes durante la 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 la cadena de información formateada seguida de cada valor de propiedad individual, demostrando que las propiedades readonly aún pueden leerse desde fuera de la clase.
Hoja de referencia
PHP 8.1 introdujo las propiedades readonly, que solo pueden ser asignadas una vez y no pueden ser modificadas posteriormente:
<?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; // U001
Las propiedades de solo lectura deben tener una declaración de tipo y solo pueden ser inicializadas una vez. Funcionan con cualquier modificador de visibilidad y pueden combinarse con la promoción de propiedades en el constructor:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
}
$product = new Product("ABC123", 29.99);
echo $product->sku; // ABC123
Las propiedades de solo lectura son ideales para valores que deben permanecer constantes durante todo el ciclo de vida de un objeto, como IDs, marcas de tiempo o ajustes de configuración.
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: Crear un objeto Config usando los valores de entrada
// TODO: Imprimir el resultado de getInfo()
// TODO: Imprimir cada propiedad de solo lectura en su propia línea:
// - nombre de la aplicación
// - versión
// - conexiones máximas
?>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