Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:112194 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 27914 invoked from network); 7 Nov 2020 15:51:47 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 7 Nov 2020 15:51:47 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 5B037180508 for ; Sat, 7 Nov 2020 07:13:11 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=BAYES_05,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Sat, 7 Nov 2020 07:13:10 -0800 (PST) Received: by mail-lf1-f48.google.com with SMTP id b1so6040460lfp.11 for ; Sat, 07 Nov 2020 07:13:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=sRcwhKqCte/KWKbYrjtD6EePvZtbDB1wO9Biv1nPLNQ=; b=N46XwvBHuMp1dmckgmms1ydsm3SggU0C29IxbBo9pkRQ1/pwLv46uxcFKDsjqwRAE+ E3zkKGRHSQafYPxmIBQOCbtaf/nSDZGtIh9breoNmP4fhPu4YWd6tkMn3V7bz/J5enT7 IpMuN+23F1XjvCor5exvMJ2b+R8902w3L5nHaB/Z8vabNoKbDilQ0LB8bP4GOa/ZsEgP L9X5OjtLXsZ969uRvdq3pOLLI8Co8L/gtHi0S5D3nW1kF01paIHpdtgF6YpJdiYcly6N +hy1OYARThMprzsu5ibvT01oGVya/bU/ngfyBoJxGioNuexONziIFahYI7veSq5waA8B 3Ayw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=sRcwhKqCte/KWKbYrjtD6EePvZtbDB1wO9Biv1nPLNQ=; b=Si2ptyoNYWD9Q+YFcN3CEIRo9KKs6xf6d/WpTYb8RnwSSuzJTWlBwAiZV4dK+hykgL 55NH62p3Yee/6jeXySvDRb3ok4QD7AT7FveZ+BJLCoPC7rZUM5elo6Z1jqnrE3A4GGyq Nfv24wU5adZ2iinEPQkzCnuBfZk+UbnWJdaAL3OiRsg+hibOr7ap85jleZMgKtjFwdSA Qis4XSpwL8mk/0ZC7N7FcZ9IGBkYPbVl6j8+UFJGBDptmmOwDYldhfdUkU+vCK5S1Kvj gKNKeCKV01ZeJz9vF/IiLUOdfJ9xQwAWoo0/FR3ql5bIrokJI8f+nk/uLyn31jGQfrUS olbQ== X-Gm-Message-State: AOAM533PsVI0k5OSpEvYMQ4ygGYchskLwza7+r6d72g2mbAxyxUP4y96 9Pq6qr+sNWuFYvYDAHfNnhH21yQLAPRBtFktsi36W+agPhoS5w== X-Google-Smtp-Source: ABdhPJz3a6A5GQxEzQmeMJdN3AA2mBjJmUOtWwAHBzISkAjNVz/DnHidqz2EIEqlil7s5M/c4gcHOxeLsiaSbucuNF4= X-Received: by 2002:a19:8417:: with SMTP id g23mr2256803lfd.296.1604761986043; Sat, 07 Nov 2020 07:13:06 -0800 (PST) MIME-Version: 1.0 Date: Sat, 7 Nov 2020 17:12:54 +0200 Message-ID: To: PHP Internals Content-Type: multipart/alternative; boundary="0000000000002096ce05b385c4bc" Subject: Union `&` operator From: zsidelnik@gmail.com (Eugene Sidelnyk) --0000000000002096ce05b385c4bc Content-Type: text/plain; charset="UTF-8" When you follow ISP, you probably would have a lot of interfaces. Thus, client code may require an object to implement a bunch of interfaces depending on functionality needed. Consider class `Bar`: ```php interface A {} interface B {} interface C {} interface D {} interface E {} class Bar implements A, B, C, D, E { // } ``` And some code, which uses `Bar`, but depends rather on interfaces, which functionality is actually needed: ```php function foo(A & B & E $object) { // some work var_dump($object); } ``` It is currently feasable like this (ugly): ```php function foo(A $object) { (function(B $object) { (function(E $object) { // some work var_dump($object); })($object); })($object); } ``` Or like this (more readable, but still): ```php function foo(A | B | E $object) { if (!$object instanceof A) { throw new \RuntimeException(); } if (!$object instanceof B) { throw new \RuntimeException(); } if (!$object instanceof E) { throw new \RuntimeException(); } // some work var_dump($object); } ``` Another possible option is to create interface, which combines `A`, `B`, `E`, but in some cases it would lead us to interfaces explosion. This idea proposes to eliminate `instanceof` checks by introducing `&` union operator. --0000000000002096ce05b385c4bc--