On Wed, Jun 11, 2025, at 17:34, Tim Düsterhus wrote: > 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 >
Thank you, that makes sense. — Rob