Propriétés readonly (PHP 8.1)
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 19 sur 91.
PHP 8.1 a introduit les propriétés readonly, qui ne peuvent être assignées qu'une seule fois et ne peuvent pas être modifiées par la suite. Contrairement aux constantes, les propriétés readonly sont définies lors de l'initialisation de l'objet plutôt qu'au moment de la définition de la classe.
Vous déclarez une propriété en lecture seule (readonly) en ajoutant le mot-clé readonly avant la déclaration du type :
<?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;
Sortie :
U001
AliceUne fois assignée, toute tentative de modification d'une propriété readonly provoquera une erreur. Cela les rend parfaites pour les valeurs qui doivent rester constantes tout au long de la durée de vie d'un objet, comme les IDs ou les horodatages de création.
Les propriétés readonly doivent avoir une déclaration de type et ne peuvent être initialisées qu'une seule fois, soit dans le constructeur, soit au moment de la déclaration. Elles fonctionnent avec n'importe quel modificateur de visibilité :
<?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;
Sortie :
ABC123Point clé : Les propriétés readonly offrent l'immutabilité au niveau de la propriété. Elles sont idéales pour les données qui identifient un objet ou qui ne devraient pas changer après la création, combinant la flexibilité de l'initialisation au runtime avec la sécurité d'empêcher les modifications accidentelles.
Défi
FacileConstruisons un système de configuration immuable qui utilise des propriétés readonly pour garantir que les paramètres critiques ne peuvent pas être modifiés accidentellement après l'initialisation.
Vous allez créer deux fichiers qui travaillent ensemble pour gérer la configuration de l'application :
Config.php— Définissez une classeConfigqui représente la configuration de l'application avec des paramètres immuables. La classe doit avoir trois propriétés publiques readonly :string $appName,string $version, etint $maxConnections. Utilisez la promotion de constructeur pour déclarer et initialiser les trois propriétés readonly dans une seule définition de constructeur propre. Ajoutez une méthodegetInfo()qui retourne une chaîne de caractères au format"[appName] v[version] (max: [maxConnections] connections)".main.php— Incluez le fichier de la classe Config. Vous recevrez trois entrées : le nom de l'application, la version et le nombre maximum de connexions (sous forme de chaîne de caractères qui doit être convertie en entier). Créez un objetConfigen utilisant ces valeurs. Affichez le résultat degetInfo()sur la première ligne. Ensuite, affichez chaque propriété readonly sur sa propre ligne en y accédant directement : le nom de l'application, la version et le nombre maximum de connexions.
Les propriétés readonly garantissent qu'une fois qu'une configuration est créée, ses valeurs sont verrouillées — ce qui est parfait pour les paramètres qui doivent rester constants tout au long de l'exécution de votre application. Remarquez comment la promotion de constructeur combinée avec readonly crée une manière très concise de définir des objets de valeur immuables.
Votre sortie doit afficher la chaîne d'information formatée suivie de chaque valeur de propriété individuelle, démontrant que les propriétés readonly peuvent toujours être lues depuis l'extérieur de la classe.
Aide-mémoire
PHP 8.1 a introduit les propriétés readonly, qui ne peuvent être assignées qu'une seule fois et ne peuvent pas être modifiées par la suite :
<?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
Les propriétés readonly doivent avoir une déclaration de type et ne peuvent être initialisées qu'une seule fois. Elles fonctionnent avec n'importe quel modificateur de visibilité et peuvent être combinées avec la promotion de propriété de constructeur :
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
}
$product = new Product("ABC123", 29.99);
echo $product->sku; // ABC123
Les propriétés readonly sont idéales pour les valeurs qui doivent rester constantes tout au long de la durée de vie d'un objet, comme les identifiants, les horodatages ou les paramètres de configuration.
Essayez vous-même
<?php
require_once 'Config.php';
// Lire les entrées
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO : Créer un objet Config en utilisant les valeurs d'entrée
// TODO : Afficher le résultat de getInfo()
// TODO : Afficher chaque propriété en lecture seule sur sa propre ligne :
// - nom de l'application
// - version
// - connexions maximales
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie