Re: [Pre-RFC Discussion] User Defined Operator Overloads (again)
| From: | Rowan Tommins [IMSoP] | Date: | Tue, 17 Sep 2024 22:13:13 +0000 |
| Subject: | Re: [Pre-RFC Discussion] User Defined Operator Overloads (again) | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-125605@lists.php.net to get a copy of this message | ||
On 17/09/2024 21:37, Rob Landers wrote:
I would prefer to see something simple, and easy to reason about. We can abuse some mathematical properties to result in something quite simple:
1. If both are scalar, use existing logic.
2. If one is scalar and the other is not, use existing logic.
3. If one is scalar and the other overrides the operation, rearrange
the operation per its communitive rules so the object is on the
left. $scalar + $obj == $obj + $scalar; $scalar - $obj == -$obj +
$scalar, -($obj - $scalar). It is generally accepted (IIRC) that
when scalars are involved, we don’t need to be concerned with
non-abelion groups.
4. If both are objects, use the one on the left.
Step 3 requires operators to be overloaded in groups: the rearrangement of the binary "-" operator requires definitions of both the unary "-" operator and the binary "+" operator; and definitions that meet the appropriate mathematical rules.
IMO, that's a lot more complicated than calling the "+" overload with an OperandPosition::RightSide flag; or Python's approach of separate "add" and "reflected add" magic methods.
Since you mentioned Scala, I looked it up, and it seems to be on the other end of the spectrum: operators are just methods, with no mathematical meaning or special dispatch behaviour. In fact, "a plus b" is just another way of writing "a.plus(b)", so "a + b" is just a way of writing "a.+(b)"
Maybe it would be "useful enough" to just restrict to left-hand side:
1. If the left operand is an object which implements the specified operator, call that implementation with the right operand as argument
2. Else, proceed as current PHP.
This is where gathering a good catalogue of use cases would come in handy: which of them would be impossible, or annoyingly difficult, with a more restrictive resolution method?
Regards,
--
Rowan Tommins
[IMSoP]