Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:102390 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 1443 invoked from network); 24 Jun 2018 14:11:14 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 24 Jun 2018 14:11:14 -0000 Authentication-Results: pb1.pair.com smtp.mail=rudolf.theunissen@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=rtheunissen@php.net; sender-id=unknown Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.213.41 as permitted sender) X-PHP-List-Original-Sender: rudolf.theunissen@gmail.com X-Host-Fingerprint: 209.85.213.41 mail-vk0-f41.google.com Received: from [209.85.213.41] ([209.85.213.41:36529] helo=mail-vk0-f41.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id AA/39-13077-F76AF2B5 for ; Sun, 24 Jun 2018 10:11:12 -0400 Received: by mail-vk0-f41.google.com with SMTP id o138-v6so6424878vkd.3 for ; Sun, 24 Jun 2018 07:11:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=DwyjMLJrqBT+/2++XCL/J4D7NYGCnQTyTwUlNZ/MnbA=; b=Qle7voASfVBBPXMo8WzBKwcarfwMEF4xxKe69bku8S/AdMiJwiaIAkv2weHhYX0u+J FDX/jblotXHmCFS+0ES+wHZErmo6kuy+Ggd6hwIhTyAGVuorD2OZm/kkej35KkrTCibk gO4uCB5OWI/xdSiCngBn3XeMi89Zb58BOzt2c6ZyVC3FFSVZdMQ8YNeI/K7avEexW5qF Zkm8LuT5l1KrEyvo+VaIJpwANRQ6ojKvVRd8nAVeXXQ0AFoZ3u+a520D0wKTAvz4OH0F RcBEAytL7hfWsLxHBsj43uST/EqTJRbmHKQ0tQXCWB9VWjy/G1BU+zMLuv7TJrmjzxdi GK0g== X-Gm-Message-State: APt69E21VYM4uicsxnJj5NridFs26VQkQO7KiyoTgewqzFkn3tCI987F WHyracX6ciWQtqhvSLisE89I0CdW X-Google-Smtp-Source: ADUXVKJuNhWy9oWIVDc1PAsuMc0TTnO/nsdxn/y6N12d6SJ9wRWQiTuRdej/EY/FIa+CLSiyQnl2lg== X-Received: by 2002:a1f:5d85:: with SMTP id r127-v6mr5320510vkb.20.1529849467958; Sun, 24 Jun 2018 07:11:07 -0700 (PDT) Received: from mail-ua0-f182.google.com (mail-ua0-f182.google.com. [209.85.217.182]) by smtp.gmail.com with ESMTPSA id i11-v6sm3788903uaf.56.2018.06.24.07.11.07 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 24 Jun 2018 07:11:07 -0700 (PDT) Received: by mail-ua0-f182.google.com with SMTP id s13-v6so7053431uad.2 for ; Sun, 24 Jun 2018 07:11:07 -0700 (PDT) X-Received: by 2002:ab0:4802:: with SMTP id b2-v6mr5639008uad.36.1529849466999; Sun, 24 Jun 2018 07:11:06 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Sun, 24 Jun 2018 10:10:55 -0400 X-Gmail-Original-Message-ID: Message-ID: To: internals@lists.php.net Content-Type: multipart/alternative; boundary="0000000000000a5ac0056f63d62a" Subject: Re: [PHP-DEV] Equality and relative ordering of objects From: rtheunissen@php.net (Rudi Theunissen) --0000000000000a5ac0056f63d62a Content-Type: text/plain; charset="UTF-8" Here is a WIP implementation of `__compareTo`, with some decent tests. https://github.com/php/php-src/compare/master...rtheunissen:rt-compare-to-magic-method?diff=unified On Fri, 22 Jun 2018 at 17:03, Rudi Theunissen wrote: > On further investigation, I'm not sure if we need both `__equals` and > `__compareTo`, > even with all the talk about contexts and the fact that an object can be > tested for > equality and not necessarily ordering as well. If we take out the > `__equals` method > and only include `__compareTo`, we can allow the user to return NULL to > indicate > that the object doesn't support the comparison that is being done. So the > return > values of `__compareTo` then becomes: > > ``` > 1: Greater than > -1: Less than > 0: Equal to, == > NULL: Unsupported, fall back to default behaviour. > ``` > In the case of an object returning NULL, we can fall back to the default > behaviour, > which is equivalent to the `compare` handler returning FAILURE, which then > falls > through to the `compare_objects` handler. > > I think this will be less confusing and much easier to implement. > > It's interesting to note that Java's `Comparable` interface considers a > 0-return > to indicate equality, where a `==` would compare references in the same > way > PHP's `===` would. So in dropping the `__equals` method, we're slightly > more > aligned with Java, even though that's not exactly the goal here. :p > > On Fri, 22 Jun 2018 at 13:55, Rudi Theunissen wrote: > >> What's the best place to override == internally? `do_operation` or a new >> object handler? >> I'd like to separate equality from compare_function.. or should we ignore >> `__equals ` >> and assume that the values are equal if `__compareTo` returns 0? >> >> Here's some context: I'm modifying `is_equal_function` to check for an >> `__equals` >> implementation if the value is an object, which I think should work, but >> it's not clear how >> an internal object (like the ds structures, for example) should override >> ==. >> >> `do_operation` seems like a good choice for this, but I wanted to check >> with you all first. >> >> >> >> On Fri, 22 Jun 2018 at 13:06, Rudi Theunissen >> wrote: >> >>> > Yes, that's the type of thing that I think needs to be included as >>> > part of the RFC. >>> > >>> > Including a list of all the (or at least the important) functions that >>> > would be affected by this RFC should be made both for clarity and so >>> > that people can think through any edge cases. >>> >>> >>> Absolutely. I was hoping to gather some thoughts and opinions first >>> while I >>> work on the implementation before I submit an official RFC. I'll make >>> sure to >>> include what you've mentioned, I completely agree. >>> >>> On Fri, 22 Jun 2018 at 11:14, Dan Ackroyd >>> wrote: >>> >>>> On 22 June 2018 at 12:31, Rudi Theunissen wrote: >>>> >>>> > >>>> >> I think if you want to push the RFC forward, a really quite strong >>>> >> case needs to be made for why having it be a language level feature >>>> is >>>> >> so much better (or even at all better) than having it be implemented >>>> >> in userland. >>>> >>>> > >>>> > >>>> > 1. You can't override the behaviour of `<`, `<=`, `>`, `>=`, `==`, >>>> `!=` with >>>> > a userland implementation. >>>> > 2. Therefore, you won't be able to affect the internals of array >>>> functions >>>> > like `in_array`, `sort` etc. >>>> >>>> >>>> Yes, that's the type of thing that I think needs to be included as >>>> part of the RFC. >>>> >>>> Including a list of all the (or at least the important) functions that >>>> would be affected by this RFC should be made both for clarity and so >>>> that people can think through any edge cases. >>>> >>>> cheers >>>> Dan >>>> >>> --0000000000000a5ac0056f63d62a--