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, a las que solo se puede asignar un valor una vez y que no pueden modificarse posteriormente. A diferencia de las constantes, las propiedades de solo lectura se establecen durante la inicialización del objeto, en lugar de hacerlo en el momento de definir la clase.
Declaras una propiedad de solo lectura agregando 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 de solo lectura provocará un error. Esto las hace perfectas para valores que deben permanecer constantes durante toda la vida útil de un objeto, como los identificadores o las marcas de tiempo de creación.
Las propiedades de solo lectura deben tener una declaración de tipo y solo se les puede asignar un valor 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 predeterminado 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;
Salida:
ABC123Punto clave: Las propiedades de solo lectura proporcionan inmutabilidad a nivel de propiedad. Son ideales para los datos que identifican un objeto o que no deberían cambiar después de su creación, ya que combinan la flexibilidad de la inicialización en tiempo de ejecución con la seguridad de evitar modificaciones accidentales.
Desafío
FácilConstruyamos un sistema de configuración inmutable que utilice propiedades readonly para garantizar que la configuración crítica no pueda cambiarse accidentalmente después de la inicialización.
Crearás dos archivos que funcionan 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úblicas readonly:string $appName,string $versionyint $maxConnections. Usa la promoción del constructor para declarar e inicializar las tres propiedades readonly en una única definición de constructor clara y concisa. Añade un métodogetInfo()que devuelva una cadena 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 el número máximo de conexiones (como una cadena que debe convertirse en un entero). Crea un objetoConfigusando estos valores. Imprime el resultado degetInfo()en la primera línea. Después, imprime cada propiedad readonly en su propia línea accediendo directamente a ellas: el nombre de la aplicación, la versión y el número máximo de conexiones.
Las propiedades readonly garantizan que, una vez creada una configuración, sus valores permanezcan establecidos, lo que resulta perfecto para los ajustes que deben mantenerse constantes durante toda la ejecución de tu aplicación. Observa cómo la promoción del constructor combinada con readonly proporciona una forma muy concisa de definir objetos de valor inmutables.
Tu salida debe mostrar la cadena de información formateada seguida del valor individual de cada propiedad, demostrando que las propiedades readonly aún pueden leerse 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: 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 app
// - 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 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