PHP 8.5 a été publié le 20 novembre 2025 et, dans les nouvelles fonctionnalités proposées par cette version, on trouve notamment la possibilité de mettre à jour des propriétés lors du clonage d’objets. Une amélioration qui va permettre de simplifier nos objets immuables.
En programmation orientée objet, un objet immuable est un objet dont l’état ne peut pas être modifié après sa création. Ainsi, toute “modification” visant à changer l’état de ce dernier conduit à la création d’une nouvelle instance avec les valeurs mises à jour. Cela représente un réel avantage, car leur état ne changeant jamais, les effets de bord et bugs liés à des modifications inattendues de l’objet sont ainsi limités.
Avant PHP 8.5, la modification d’un objet immuable pouvait s’avérer fastidieuse, car il était nécessaire de créer une nouvelle instance avec les nouvelles valeurs. Cela pouvait être d’autant plus contraignant si l’objet avait de nombreuses propriétés.
Par exemple:
readonly class GPSLocation
{
public function __construct(
public float $latitude,
public float $longitude,
public float $altitude,
public DateTimeImmutable $timestamp,
) {
}
public function withCoordinates(float $latitude, float $longitude): GPSLocation
{
return new GPSLocation(
$latitude,
$longitude,
$this->altitude,
$this->timestamp,
);
}
public function withAltitude(float $altitude): GPSLocation
{
return new GPSLocation(
$this->latitude,
$this->longitude,
$altitude,
$this->timestamp,
);
}
}PHP 8.5 nous permet de simplifier cette opération en permettant de cloner l’objet tout en autorisant de mettre à jour certaines propriétés lors du clonage. Seules les propriétés devant être modifiées doivent être précisées:
readonly class GPSLocation
{
public function __construct(
public float $latitude,
public float $longitude,
public float $altitude,
public DateTimeImmutable $timestamp,
) {
}
public function withCoordinates(float $latitude, float $longitude): GPSLocation
{
return clone($this, [
'latitude' => $latitude,
'longitude' => $longitude,
]);
}
public function withAltitude(float $altitude): GPSLocation
{
return clone($this, [
'altitude' => $altitude,
]);
}
}