On Sun, Nov 24, 2024, at 8:38 AM, Rowan Tommins [IMSoP] wrote:
> Hi Larry,
>
> I think that's a useful breakdown of the concepts involved. I don't
> think it's a bad thing to have a feature that covers multiple of them -
> common cases shouldn't need a long string of modifiers like "immutable
> copyonwrite valueequality class Point { ... }" - but being explicit
> about what we are and are not including is wise.
>
> There is one point I'd like to nitpick on, though:
>
>
> On 23/11/2024 20:35, Larry Garfield wrote:
>> 3. Physical equality. This is what === does, and checks that two variables refer to the
>> same memory location. Physical equality implies logical equality, but not vice versa.
>
>
> PHP's === operator is not, in general, an identity operator; it is a
> "strict equality" operator, whose exact meaning depends on the type of
> its operands.
>
> For "scalar" types, it checks the concrete type and the value: 1+1 ===
> 2, and strtoupper('hello') === 'HELLO'
>
> For arrays, the definition is applied recursively: two arrays are
> loosely equal if all their elements are loosely equal, and strictly
> equal if all their elements are strictly equal.
>
> Objects are really the outlier, overloading the operator to mean
> "identity" rather than applying a strict value comparison.
>
> Example: https://3v4l.org/udOoU
>
> If we introduce some new "value type", it seems very reasonable to use
> the same recursive definition of strict equality used for arrays.
>
>
> --
> Rowan Tommins
> [IMSoP]
Valid point, thank you. Though I'm still not convinced that value object equality behaving
differently from normal object equality is going to be self-evident or intuitive.
Either way, my core point still stands: Give me a way to directly control how equality works
per-class, like most of our sibling languages do, and we're all set. Problem solved.
--Larry Garfield