Menu
Coddy logo textTech

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 affecté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é readonly en ajoutant le mot-clé readonly avant la déclaration de 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
Alice

Une fois assignée, toute tentative de modifier une propriété readonly provoquera une erreur. Cela les rend parfaites pour les valeurs qui devraient rester constantes pendant toute la durée de vie d'un object, comme les identifiants ou les horodatages de création.

Les propriétés readonly doivent avoir une déclaration de type et ne peuvent être affectées qu’une seule fois, depuis l’intérieur de la class qui les déclare (généralement dans le constructor). 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 :

ABC123

Point clé : Les properties readonly assurent l’immuabilité au niveau de la property. Elles sont idéales pour les données qui identifient un object ou qui ne devraient pas changer après la création, combinant la flexibilité de l’initialisation à l’exécution avec la sécurité contre les modifications accidentelles.

challenge icon

Défi

Facile

Construisons 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 l'initialisation.

Vous allez créer deux fichiers qui fonctionneront ensemble pour gérer la configuration de l'application :

  • Config.php : définissez une Config class qui représente la configuration de l'application avec des paramètres immuables. La class doit posséder three propriétés public readonly : string $appName, string $version et int $maxConnections. Utilisez la promotion du constructor pour déclarer et initialiser les three propriétés readonly dans une seule définition de constructor claire et concise. Add une méthode getInfo() qui renvoie une string au format "[appName] v[version] (max: [maxConnections] connections)".
  • main.php : incluez le fichier de la Config class. Vous recevrez three entrées : le nom de l'application, la version et le nombre maximal de connexions (sous la forme d'une string qui doit être convertie en entier). Créez un objet Config en utilisant ces values. Affichez le résultat de getInfo() 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 values restent verrouillé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 constructor combinée à readonly permet de définir des objets valeur immuables de manière très concise.

Votre sortie doit afficher la string d'informations formatted, suivie de la valeur de chaque propriété individuelle, démontrant que les propriétés readonly peuvent toujours être lues depuis l'extérieur de la class.

REQUIRED OUTPUT FORMAT: [Your translated content here]

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

?>
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur PHP en ligne