Hi Alexander On Tue, Apr 2, 2024 at 4:53 AM Alexander Pravdin <alex.prav...@interi.co> wrote: > > On Tue, Apr 2, 2024 at 9:18 AM Ilija Tovilo <tovilo.il...@gmail.com> wrote: > > > > I'd like to introduce an idea I've played around with for a couple of > > weeks: Data classes, sometimes called structs in other languages (e.g. > > Swift and C#). > > While I like the idea, I would like to suggest something else in > addition or as a separate feature. As an active user of readonly > classes with all promoted properties for data-holding purposes, I > would be happy to see the possibility of cloning them with passing > some properties to modify: > > readonly class Data { > function __construct( > public string $foo, > public string $bar, > public string $baz, > ) {} > } > > $data = new Data(foo: 'A', bar: 'B', baz: 'C'); > > $data2 = clone $data with (bar: 'X', baz: 'Y');
What you're asking for is part of the "Clone with" RFC: https://wiki.php.net/rfc/clone_with This issue is valid and the RFC would improve the ergonomics of readonly classes. However, note that it really only addresses a small part of what this RFC tries achieve: > Some APIs further exacerbate the issue by requiring multiple copies for multiple modifications (e.g. `$response->withStatus(200)->withHeader('X-foo', 'foo');`). Readonly works fine for compact data structures, even if it is copied more than it needs. For large data structures, like large lists, a copy for each modification would be detrimental. https://3v4l.org/GR6On See how the performance of an insert into an array tanks if a copy of the array is performed in each iteration (due to an additional reference to it). Readonly is just not viable for data structures such as lists, maps, sets, etc. Ilija