Hi
Am 2025-06-08 21:15, schrieb Rob Landers:
So, it seems like this can only be used for things that can already be
cloned?
Yes. It's an extension of the existing cloning functionality.
Things which are directly trying to block an identical clone, but would
otherwise be fine with a clone that changes the value (e.g. value
objects) aren’t allowed to use this new feature?
To me, that feels like an oversight in the design.
Trying to enforce “singleton” objects to be able to `===` compare them
already requires you to take care of quite a number of things (e.g.
making the constructor private, disallowing serialization, …) and
cloning is no different in that regard.
Nevertheless you can make `__clone()` private (which means that cloning
is only allowed from within the class, no Exception necessary) and then:
private function __clone() { }
public function withFoo($foo) {
if ($this->foo === $foo) {
return $this;
}
return clone($this, ['foo' => $foo]);
}
To make sure you are only creating a clone when actually changing
anything.
Best regards
Tim Düsterhus