Middle
Cela signifie-t-il que la classe est immuable si elle a une propriété publique dans la classe?
sobes.tech IA
Réponse de l'IA
Non.
Une propriété publique dans une classe signifie que la valeur de cette propriété peut être modifiée depuis l'extérieur de l'objet. Un objet immuable est celui dont l'état (valeurs de ses propriétés) ne peut pas être modifié après sa création. La présence d'une propriété publique contredit le principe d'immuabilité.
Pour atteindre l'immuabilité, la classe doit respecter les conditions suivantes :
- Toutes les propriétés doivent être privées (
private) ou protégées (protected). - Il ne doit pas y avoir de setters (méthodes modifiant les valeurs des propriétés).
- Toutes les dépendances (objets avec lesquels la classe travaille) doivent également être immuables ou leur état ne doit pas changer depuis l'extérieur.
- Le constructeur doit initialiser complètement l'objet et il ne doit pas être modifié après la création.
- Si des modifications sont nécessaires, de nouvelles instances de l'objet doivent être créées avec les nouvelles valeurs.
Exemple d'une classe avec une propriété publique (mutable) :
<?php
class MutableObject
{
public $value; // Propriété publique
public function __construct($value)
{
$this->value = $value;
}
}
$obj = new MutableObject(10);
echo $obj->value; // 10
$obj->value = 20; // La valeur est modifiée depuis l'extérieur
echo $obj->value; // 20
Exemple d'implémentation d'une classe immuable :
<?php
class ImmutableObject
{
private $value; // Propriété privée
public function __construct($value)
{
$this->value = $value;
}
public function getValue() : int
{
return $this->value;
}
// Méthode pour "modifier" la valeur, en réalité crée un nouvel objet
public function withValue(int $newValue) : self
{
return new self($newValue);
}
}
$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10
// $obj1->value = 20; // Erreur : Impossible d'accéder à la propriété privée
$obj2 = $obj1->withValue(20); // Un nouvel objet est créé
echo $obj1->getValue(); // 10 (l'objet original n'a pas changé)
echo $obj2->getValue(); // 20 (nouvel objet avec la nouvelle valeur)