PHP value objects have become much nicer over the last few releases, but cloning them has still been more awkward than it should be. Readonly properties are useful, immutable objects are useful, and withSomething() methods are useful. The annoying part has been writing the same cloning ceremony again and again just to change one property safely.
PHP 8.5’s release announcement calls this “Clone With”, and the clone-with RFC explains the real motivation: making clone work properly with readonly properties and common wither-style patterns. That is exactly the kind of small language feature that matters in domain code, because value objects are only pleasant if they stay lightweight.
I would not use this as an excuse to make everything immutable. PHP applications still need simple mutable objects in plenty of places. But for money values, date ranges, identifiers, request options, API payload objects, and other things where accidental mutation causes pain, clone-with syntax lowers the cost of doing the cleaner thing.
The important caveat is validation. If a value object has invariants, cloning with a changed property should not become a side door around them. That is where PHP’s newer property tooling starts to fit together: readonly, asymmetric visibility, property hooks, and clone-with are more interesting as a set than as isolated features. The direction is good: less boilerplate, more explicit object state.
