Re: [RFC] [Discussion] Clone with
| From: | Stephen Reay | Date: | Fri, 09 Jun 2023 05:34:34 +0000 |
| Subject: | Re: [RFC] [Discussion] Clone with | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-120549@lists.php.net to get a copy of this message | ||
> On 9 Jun 2023, at 07:11, Larry Garfield <larry@garfieldtech.com> wrote:
>
> On Thu, Jun 8, 2023, at 5:39 PM, Stephen Reay wrote:
>
>> Is there a specific reason
clone with (foo: $bar); can’t
>> simply pass
>> the arguments given to with(), to the __clone() magic method?
>>
>> It leaves the developer free to use the passed argument(s) or deep
>> clone existing properties or a mix depending on what’s passed, and
>> seems like it has the least “magic” or unknown behaviour in terms of
>> when things happen.
>>
>> Just a thought.
>
> I experimented with that a few years back. The results showed it is actually pretty awful in
> practice.
>
> ):
µ>d›
> u63ëhttps://peakd.com/hive-168588/@crell/object-properties-part-2-examples
>
> --Larry Garfield
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
>
Hi Larry
Sure, that example __clone() isn’t exactly what I’d call short-and-sweet, but it absolutely
solves the problem of: “what happens, in which order, when you do clone ($foo) with (bar:
‘baz’, moo: ‘foo’); on an object with a __clone() method. There is zero ambiguity
there because it’s expressed in php the developer can see/debug/trace.
Also, consider that for classes that have no nullable properties, the __clone method could be a lot
simpler than your example shows, e.g.:
function __clone(?string $bar = null, ?int $baz = null, ?ComplexObj $foo = null) {
$this->bar = $bar ?? $this->bar;
$this->baz = $baz ?? $this->baz;
$this->foo = $foo ?? clone ($this->foo);
}
If the property hooks RFC had already passed a vote, I’d suggest that some expansion of hooks
could provide a cleaner solution here, but it hasn’t yet (and I understand it’s not desirable to
tie the fate of one RFC to another so heavily) so here we are.
Cheers
Stephen