Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Copie rapide de DTO ou VO

By Benoit Viguier

<?php

class DTO {
    public function __construct(
        public int $a,
        public int $b,
        public int $c,
        public int $d,
        public int $e,
        public int $f,
    ) {}
}

$dto = new DTO(1, 2, 3, 4, 5, 6);
var_dump($dto);

// #PHP 8.2+, with named parameters in arrays
$copy = new DTO(...(['d' => 42] + get_object_vars($dto)));
var_dump($copy);

// #PHP 8.0–1+, with unnamed parameters in arrays
$copy2 = new 
DTO(...array_values(array_merge(get_object_vars($dto), ['d' => 42])));
var_dump($copy2);

// #PHP 7.4– : not supported

Une petite astuce PHP combinant les paramètres nommés, le spread et les opérateurs d’union de tableaux pour créer facilement une copie modifiée d’un DTO : https://3v4l.org/ZWX5G#v8.2.10

C’est amusant si vous avez beaucoup de paramètres, mais utiliser une chaîne contenant le nom du paramètre n’est pas vraiment satisfaisant.

Il est possible d’étendre cette syntaxe à PHP 8.0+ avec un array_values() / array_merge() astucieux : https://3v4l.org/igrsW

$copy = new DTO(...(array_values(array_merge(get_object_vars($dto), ['d' => 43]))));

Cependant, cette syntaxe étendue est vulnérable à l’ordre de définition des propriétés, à l’ordre des arguments du constructeur et à la suppression temporaire de propriétés, contrairement à l’approche originale.

See Also

PHP Features

Last updated: 18 September 2026