Re: [RFC] [Discussion] Clone with
| From: | Larry Garfield | Date: | Tue, 30 May 2023 23:53:13 +0000 |
| Subject: | Re: [RFC] [Discussion] Clone with | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-120480@lists.php.net to get a copy of this message | ||
On Tue, May 30, 2023, at 10:04 PM, Alexandru Pătrănescu wrote:
> On Tue, May 30, 2023, 19:39 Larry Garfield <larry@garfieldtech.com> wrote:
>
>> On Mon, May 29, 2023, at 11:22 PM, Máté Kocsis wrote:
>> > To be honest, the current behavior seemed like the natural choice for
>> > me, and I didn't really consider to execute the __clone() method after
>> the
>> > clone assignments.
>> > Do you have a use-case in mind when you need to forward-pass information
>> to
>> > __clone()?
>>
>> Not a specific one off hand. It's more a conceptual question.
>>
with has
>> more contextual awareness than __clone(), so it should have "first crack"
>> at the operation, so that if necessary it can make changes that __clone()
>> can then respond to. The inverse doesn't make sense.
>>
>> The only reason for with to come after would be to allow
>> with to
>> "override" or "undo" something that __clone() did. Generally speaking,
>> if
>> you have to undo something you just did, you shouldn't have done it in the
>> first place, so that's a less compelling combination.
>>
>> This one isn't a deal breaker, but we should be sure to think it through
>> as it's kinda hard to reverse later.
>>
>
> To me so far also it was natural to assume that __clone is first and only
> after that the rest of the operations.
> But with operations, be it properties assignment or even a
> closure, would
> run in the context of the caller of clone and sometimes this might be run
> not from a method of the cloned class.
>
> An example:
> There is a class that represents persons of a fictive country/planet.
> Each person has many properties but has also a first name and a last name
> and there is a rule: the two names must not start with the same letter.
> Both names cannot be changed as they are defined readonly.
> Creation of new persons can be done using new for new random properties or
> using clone to preserve existing properties. But in both cases the first
> name and last name are randomly chosen.
> If we want to control the last name value during clone that would be
> possible using the with operation but the logic to allocate a
> first name
> will only happen in __clone()method.
>
> To be able to achieve this we must have __clone last, as there we have the
> internal validations, operations and also access to private/protected
> members that are not accesible from where clone is being called.
>
> Regards,
> Alex
I... could not understand that in the slightest. Can you show it in code?
--Larry Garfield