Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:112433 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 29002 invoked from network); 5 Dec 2020 20:50:30 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 5 Dec 2020 20:50:30 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 98A401804C3 for ; Sat, 5 Dec 2020 12:19:00 -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=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, 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-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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, 5 Dec 2020 12:19:00 -0800 (PST) Received: by mail-wm1-f43.google.com with SMTP id w206so6910655wma.0 for ; Sat, 05 Dec 2020 12:18:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding:content-language; bh=knUzefAtH5IEXGxk/If9RSyfBMMYb+STHdmByROQX7w=; b=UUooQdHxPwgrHCMafBCh12y0kkG7ilyo8S/PxvO+EgoifyIBG63bQ6t9cJcnijdt2z c6BcwF5EZOLUtkiSvC3kpwkTYmZuqiQt8SvK7u6DfK0ENKe8TskBYWMN5JjK6ijPdWuy fhpTo1KIJ8UjKQXBzKUr7rg/ZWJcJbuRp4OmRx0mukrZaS9cj48fwlKCdnRaw7XFj5DL r8acMa7eLR2l2buRf5JzCM7AhKGu/TLF0zXKYGBtOI6JSkzn0sylL+flc7+AXZtmA9dB jpIU0Gfss7I+TjSIfWJbEdYa7PO1z+wdOQSCJVNVHjcrn3mQUO7ZptoBCIZfv4Jd5/ib X4pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=knUzefAtH5IEXGxk/If9RSyfBMMYb+STHdmByROQX7w=; b=gK4/eLVowGhfGh3pBfFaO3sSqp17dT9fNqnIAQW+XVOJQmMSd2rNbnkCmM5sqbx/ll IpYH1LnChcsF+2Z2XLy8eG4cG5dCOAaQuggC53Kc5EeFjg8kXFYN0F6E7y4pdtW2cAUH gBzo3yumlhKfv/UJ4orS5PNQMTwHkBKxGTo0ELHL9TrDKH2nJq8CPNQX1nWZH8fyaphc vam4tz1xi2AmImDNwuLziHrpbHDlvXt0IvJeSVdr6Rkrhwt/Fu0Whez39e4cCBPt2Qlg nvUfb7u6072qdp+Ug4fvKPyXpj8EXoHtgSQMxuEMHN/xryz+j7R5eLZ+uBj7XmUn9EeD 5eKw== X-Gm-Message-State: AOAM531ERHcgdPDmdOqNLaHRYr+tKKTNUXqebJTcJwJ5gW6bkbm/Slrn dvZ2agTzkR6EdfhC2KAoihOAJtCrhrY= X-Google-Smtp-Source: ABdhPJyzfcM/MvYnK9JBjqF+V7OpcUypP+ig26MziPwFaGo07//M1uHqrRm+gfHUEPleAMfz91cRlQ== X-Received: by 2002:a1c:730c:: with SMTP id d12mr10609188wmb.3.1607199538084; Sat, 05 Dec 2020 12:18:58 -0800 (PST) Received: from [192.168.0.22] (cpc104104-brig22-2-0-cust548.3-3.cable.virginm.net. [82.10.58.37]) by smtp.googlemail.com with ESMTPSA id z17sm1840375wrh.88.2020.12.05.12.18.57 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 05 Dec 2020 12:18:57 -0800 (PST) To: internals@lists.php.net References: <9EA6E41D-B41F-4DF7-9A11-225DE74CED14@mabe.berlin> Message-ID: Date: Sat, 5 Dec 2020 20:18:55 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: <9EA6E41D-B41F-4DF7-9A11-225DE74CED14@mabe.berlin> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-GB Subject: Re: [PHP-DEV] [RFC] Enumerations From: rowan.collins@gmail.com (Rowan Tommins) On 05/12/2020 19:21, Marc Bennewitz wrote: > I mean on mapping something to something else defined as a single assoc array constant. > Something like: > > enum Role { > case User, > case Admin, > ... > } > > enum Action { > case Order_Edit, > case Order_Read, > > private const BY_ROLE = [ > Role::User => [self::Order_Read], > Role::Admin => [self::Order_Read, self::Order_Edit], > ]; > > public function isAllowed(User $user) { > return in_array($this, self::BY_ROLE[$user->role]); > } > } That example can be rewritten directly as a static method and match statement, which I think would look like this: enum Action { case Order_Edit; case Order_Read; private static function byRole(Role $role) { return match($role) {   Role::User => [self::Order_Read], Role::Admin => [self::Order_Read, self::Order_Edit], }; } public function isAllowed(User $user) { return in_array($this, self::byRole($user->role)); } } The scenario can also be modelled the other way around with case methods: enum Action { public function isAllowed(User $user) { // Default case denying all, might be useful with a long list of cases return false; }  case Order_Edit { public function isAllowed(User $user) { return $user->role === Role::Admin; } }  case Order_Read { public function isAllowed(User $user) { return $user->role === Role::User || $user->role === Role::Admin; } } } Regards, -- Rowan Tommins (né Collins) [IMSoP]