On 30 June 2018 19:04:27 BST, Rudolf Theunissen <[email protected]>
wrote:
>We're proposing the ability for a user to determine how a class should
>be
>compared to another value. The ability to change the semantics of the
>comparison operators is an unavoidable side effect.
Absolutely, I agree with the intent of this RFC. I think what I was suggesting
is that if people in future want to overload the operators specifically, we
would want to provide an overload for <=> that was separate from __compareTo,
so that you could overload that without breaking things like sorting.
>> I think __compareTo() and __equals() could act more like a return
>type
>hint, and either throw a TypeError straight away, or attempt to coerce
>to
>the correct type and throw a TypeError on failure.
>
>Currently they do attempt to convert to boolean and integer,
>respectively,
>but that doesn't achieve much because you can still return nothing in
>either case and the coercion would be 0 and false.
Apologies if this is covered in the RFC, but does that apply wherever they are
used? For instance, what will the following code do?
class SpaceStation {
public $shape;
public function __construct($shape='[]') {
$this->shape = $shape;
}
public function __compareTo($other) {
return new self($this->shape . '>=<' . $other->shape);
}
}
$a = new SpaceStation;
$b = new SpaceStation;
$c = $a <=> $b; // Error? 0?
echo $c->shape; // or will this echo '[]>=<[]'?
$d = $a < $b; // Same result?
$list = [$a, $b, $c, $d];
sort($list); // Or will the error only be raised here?
>The decision whether to accept this will come down to the trade-off
>between
>flexibility and potential for misuse.
Absolutely, and for what it's worth (which isn't much) I'm +1 on this, if it's
not documented as operator overloading (which I think is a separate feature)
and can't be used to produce values outside the expected type (due to coercion
or errors).
Regards,
--
Rowan Collins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php