Propriétés en lecture seule (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 affectées qu’une seule fois et ne peuvent pas être modifiées par la suite. Contrairement aux constantes, les propriétés en lecture seule 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 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 pendant toute la durée de vie d’un objet, comme les identifiants ou les horodatages de création.
Les propriétés en lecture seule doivent avoir une déclaration de type et ne peuvent être assignées qu’une seule fois, depuis la classe qui les déclare (généralement dans le constructeur). Contrairement aux propriétés normales, elles ne peuvent pas recevoir de valeur par défaut lors de leur 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 en lecture seule assurent 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 sa création, en combinant la flexibilité de l’initialisation à l’exécution avec la sécurité qu’offre la prévention des modifications accidentelles.
Défi
FacileConstruisons un système de configuration immuable qui utilise des propriétés readonly afin de garantir que les paramètres critiques ne puissent pas être modifiés accidentellement après leur initialisation.
Vous allez créer deux fichiers qui fonctionnent 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 posséder trois propriétés publiques readonly :string $appName,string $versionetint $maxConnections. Utilisez la promotion du constructeur pour déclarer et initialiser les trois propriétés readonly dans une seule définition de constructeur claire et concise. Ajoutez une méthodegetInfo()qui renvoie une chaîne 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 maximal de connexions (sous forme de chaîne à convertir en entier). Créez un objetConfigà l’aide de ces valeurs. Affichez le résultat degetInfo()sur la première ligne. Affichez ensuite chaque propriété readonly sur sa propre ligne en y accédant directement : le nom de l’application, la version et le nombre maximal de connexions.
Les propriétés readonly garantissent qu’une fois qu’une configuration est créée, ses valeurs restent définitivement inchangées, ce qui est idéal pour les paramètres qui doivent rester constants pendant toute l’exécution de votre application. Remarquez comment la promotion du constructeur combinée à readonly permet de définir des objets-valeurs immuables de manière très concise.
Votre sortie doit afficher la chaîne d’informations formatée, suivie de la valeur de chaque propriété, afin de démontrer que les propriétés readonly peuvent toujours être lues depuis l’extérieur de la classe.
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 max
?>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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne