Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:119499 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 81826 invoked from network); 9 Feb 2023 01:30:37 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 9 Feb 2023 01:30:37 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 2A9241801FD for ; Wed, 8 Feb 2023 17:30:36 -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=-1.9 required=5.0 tests=BAYES_00,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.2 X-Spam-ASN: AS8075 40.104.0.0/14 X-Spam-Virus: No X-Envelope-From: Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2081.outbound.protection.outlook.com [40.107.243.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Wed, 8 Feb 2023 17:30:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hvFPcGUUzFJ03yqpMlGyT9hhjTih19hat8WJmsjxVQsoCj6b1/e+ONMWnvLXdIUaFF5L9BAHAmtbUUPKbTVmyA06ntvTYRGh377VPEoTHCaTGWvyKso5KqObfgQt82LsnAVTRmo0ONhYmTnF70pdtk55QI76yXgPvUz63yF99H7mmYRzZ5dJXGvYIazM5QEpr6av6pSealfTVc/Eocew88PJJDOQS9cS9k3SK3+S775gtphkldXG4k+DxPB/GbV44Jjh5klQ9YrIAkj1mKOtHQHxmZNtiE8+/KLd+7xFfRrP/MhvH9bTMZMJimzcooTqnxGMTVbo/pwPJHQ+IngQ5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tyVoGHK7eJPXrMXvQ0xOnm1xWsuRfAoisKzDQVF6Y6I=; b=DyODWr/avZI+ssctreYeDqqj0xUysI/SB9Yx4+d0DI1D+aZBwO8vapEub7XB1YakT42PSDp7XkxcAWIL5UYei8fq78mVMvgTCFuAgUgvQ0xcMwBIBh8P6/QKLYs0g3L6DxVvGhfiCLkpUVCdfIoOZQ1sN6Ry2hcXDy8MKkOaOc+ORnyysSEvJgHk+p5fJY2kOT72/fEIpzDAY+1cuci4vWjcwu1ICqPp87wLMYqBgm9UGdtVXlDlGsoLnAWYceYB4ij1WtI3YmcZrvzqlTA44jq5jSP3z/Cngm/6ZtPquJ2zlPAYNjnvlsstYf4nwfbfZLbVCeiBlw/e04lYuCIRjA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=shymko.net; dmarc=pass action=none header.from=shymko.net; dkim=pass header.d=shymko.net; arc=none Received: from PH8PR10MB6337.namprd10.prod.outlook.com (2603:10b6:510:1cc::10) by PH0PR10MB7097.namprd10.prod.outlook.com (2603:10b6:510:28f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6086.19; Thu, 9 Feb 2023 01:30:31 +0000 Received: from PH8PR10MB6337.namprd10.prod.outlook.com ([fe80::ed95:e287:42b3:6a2d]) by PH8PR10MB6337.namprd10.prod.outlook.com ([fe80::ed95:e287:42b3:6a2d%7]) with mapi id 15.20.6086.014; Thu, 9 Feb 2023 01:30:31 +0000 To: "internals@lists.php.net" Thread-Topic: RFC proposal: values getter in BackedEnum Thread-Index: AQHZPBKsBFCUG4HjfUOdbkBk+wSviw== Date: Thu, 9 Feb 2023 01:30:30 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=shymko.net; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PH8PR10MB6337:EE_|PH0PR10MB7097:EE_ x-ms-office365-filtering-correlation-id: 814c5e28-e64a-4b72-ae1c-08db0a3d3b5a x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: UIT+hGYxWSWjkBNTLA6Rq0BFEMGzDs3Mrt2X6w8Y+GJat+xEfc6uGqD15wBA278M298wtmKClkT+9Eq+nLZkanY2O9hSOppbIFTy821gzl76olNqO22JxJ3SB5xdDlY6UtWlra1a/w1P70+QJTvDFRPzuvM300g0DSSYsZ90fQ2TcfaD1nTPRbXeT3q3R4kKF5XC0K6Xc7JW1Gqdi7LXXMbX/H6vU/lGTpYXTrdR21IsUSMBn3FU7UfMvUGDCvRKMddmzCBG9DGKpCSYqS2OvZmIbfyUG9qqxCLRdwuToclUTh9nziGaGYGQS2302t+miY73An1VF7p7vP/2YEnkEU5JDaEu1kYtlShlr/06IwkEdF84n3GBSPRkTKNYfOpdwixewJ2RQoTWeSzFuODyVEC25a5P5sOaahnh4aAvhfO57oMEn6v5EOxRcK48M3Og1WjE5OESna69dOorKadnDVSwwVOcN7LXMIxcqsAxr3swuQfLacdXQ4KMADEw2/a+UDWZHq+l/RfFkV2zozYwqDF1+/vc9WP+3udj13yTir4NqbRh6bNebSAZoC394eCRjuKdNSaC6OSX/4opOrlZORjYCXP7KHMEhUduK8ffqDKFhBMrrCAlJ72NVCnPn85JBPo9sUtDKYFAYDeEIYwdyRlsIxNj/9Jb1D2uzPsAkkVIZqaJHKw2P+vVlSgam/SefuXNXi6ZKW//9nFu56lbKLcXvgt8MBvCaxfx8TPNmUA= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR10MB6337.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230025)(39830400003)(396003)(366004)(376002)(346002)(136003)(451199018)(19627405001)(83380400001)(2906002)(26005)(186003)(9686003)(6506007)(8936002)(5660300002)(33656002)(41300700001)(6916009)(8676002)(52536014)(7696005)(71200400001)(86362001)(478600001)(38100700002)(122000001)(55016003)(38070700005)(76116006)(91956017)(66446008)(66946007)(66476007)(66556008)(316002)(64756008)(461764006);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?r6y77llArfeIeNZ1XTsos9YYmgLtimAWBQKy5ZHd6Vx9ot+25bMrFvGlmw?= =?iso-8859-1?Q?o6hfviGWL+Dsh++tYkHk2QnYfWpN+sNY88lSAgg0+U39Sbi9OjvPqg0bCD?= =?iso-8859-1?Q?gxu2fo/sDRDMg9i4o+KmUCpDw8rF+RvEBHdMUuww023wusCgFMEV6VRvCU?= =?iso-8859-1?Q?MqH36oPZdRh6ggTtEFLvMKMv2R54xJcQQMXDDGNdFLr3yvX1U7EPjaRUmF?= =?iso-8859-1?Q?1dZQAekR2H8zVHuSqoQi2/25DpWoJTVoSCGiqCvynFviHBgixpfgT6wOsB?= =?iso-8859-1?Q?QBVMNCwxJ0giYMYC4k6T1Lj/2hHakT9Gi+9+BanXzNHKK0Ok9gGbDTslMo?= =?iso-8859-1?Q?2IIxVJjUIR4hZl1f50IXV2QYEhFwfzfaNodcyQzl+3Apf4WH+1r9BPQOBb?= =?iso-8859-1?Q?/HLaZxooZUp1k1t+mFEWEqTf3ySx6WJcgsGbayC1b34xdyLVC0Gyf9Hm58?= =?iso-8859-1?Q?DkCEYWXzl+4TbFNC3ULvhWOE5cqbaOR2qAYZNNYvJ826bhb36qvec5gfLu?= =?iso-8859-1?Q?+CvzSpbvsYxpRlU3Y4KZ3KCGA6UfZurKIBFaC0Slh55aIFLdJ12/ur65Ev?= =?iso-8859-1?Q?T2yPyfssJnu5LGVXik12tQvuFrwUo13Kg9vIwwZ1y/z4fleZs3vII7sP/i?= =?iso-8859-1?Q?y3ZZFgHedJE0cBK5D8hW+z3N6I9pOh8Jtks6zmUSlEaefxJMkiSLbUH3bN?= =?iso-8859-1?Q?33Ci9gAz+mCg5Ik3IrazNia+DP77H+GTkdnxvm3SPSDT1DDXdRBiSchhJX?= =?iso-8859-1?Q?6kuRWhasJuCQlOyRhd0B1nd6gO2MRWaItyYLfBSArLw3v9F9+TUpNsCmss?= =?iso-8859-1?Q?zfMU2HovuOnlegc5G77FYCc6kOobBgQXPq+umdt9ySuiJuXWPHeFukDEzl?= =?iso-8859-1?Q?r0b81dUg2VfDBtT3excxUmoglqhNW7z5bhPqIwctGy2o9xIHWmx8hrfVYV?= =?iso-8859-1?Q?AUdJGxAc6PDiIE8l8vcpD6C0N1jGeFB6Vr8XAA53DdG+UiclH3vkps3N6Z?= =?iso-8859-1?Q?ei3WDMC88wUyB+964i+NOTJzsaFoh3BLD9muLwaLuX+sjBJGOvZfSPgSdk?= =?iso-8859-1?Q?rKdJGsFQrBLwDj4JtH1u/KKNUAN5Hcdf6lZK4MI6zTPZHldNqpmhXjVsvR?= =?iso-8859-1?Q?3MR3etpE85D0Fjjlenea+MhkOOFY2EqRuMQrZnfgi3a3i2lWa+wvpAdcjz?= =?iso-8859-1?Q?tCzQNtDGmItVoRnjU+Ar43YbJ141EKrtYRp392nP1ny4lmjM7VLh+2zgKI?= =?iso-8859-1?Q?J2ttKx/vcFP3CxS5+49mVunwuOjAejTaDa51ArHAMeNhmSQH1RHX9iSVlw?= =?iso-8859-1?Q?RTjMygBd3I3zs4iH0rue1SrGJnLBNim8RiQknKhDdeMGF1fy4YXieJo4aE?= =?iso-8859-1?Q?Eh39l5ajDCk6zB36UixU9AdIrEXzcuzmIoU8baIAYitx80YLfD8hzWCyLk?= =?iso-8859-1?Q?gLPHd5F5IHh49dNOetiMDZR61A6IsWFilVFGJIWNdvHfxRBGofaw2RcHWh?= =?iso-8859-1?Q?5F8QRGnLyOZx5Z/8eLyvhKdgtqibpHwX/qE4GI/MIz3Af+dP4JyorVjT6v?= =?iso-8859-1?Q?O6MjfksLyXZlepoT7BbphSsUBzbd7G1F8dhxXhLDQbPena8L0GSoViJQoh?= =?iso-8859-1?Q?2ffdhC+NzyikU=3D?= Content-Type: multipart/alternative; boundary="_000_PH8PR10MB63372F72B718DF413DBA13C0BFD89PH8PR10MB6337namp_" MIME-Version: 1.0 X-OriginatorOrg: shymko.net X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PH8PR10MB6337.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 814c5e28-e64a-4b72-ae1c-08db0a3d3b5a X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Feb 2023 01:30:30.7513 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: d7878c48-41c7-48dd-bd7e-899af7355b7e X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: vw98+E1szPssRlffAOFuCHDfwj89n3foADOf+Vbd4BPxlY9JRoG9wCgNRRtBGF1U2KEQS6Nnurt+FJRofD1f7A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR10MB7097 Subject: RFC proposal: values getter in BackedEnum From: sergey@shymko.net (Sergii Shymko) --_000_PH8PR10MB63372F72B718DF413DBA13C0BFD89PH8PR10MB6337namp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi, I'd like to propose an improvement to backed enumerations introduced in PHP= 8.1. When using enums, it's very common to get all values using the following bo= ilerplate: $enumValues =3D array_map( fn (\BackedEnum $case) =3D> $case->value, ExampleEnum::cases() ); The primary use case is when an enum is used in a "set" (array of values). For example, a user inputs a subset of available values. The input may be optional defaulting to all values if omitted. For example, an array option of a CLI tool: $inputValues =3D $input->getOption('enum') ?: $enumValues The secondary use case is for informational purposes. For example, the CLI tool may list all available values of an enum option i= n --help. The list of values can also be used to produce informative error messages: $output->writeln("Option is invalid, allowed values: " . implode(', ', $enu= mValues)) The last use case is input validation. Although tryFrom() can be used, having access to all values can come in han= dy. For instance, you could immediately get valid and invalid enum values: $invalidValues =3D array_diff($inputValues, $enumValues); The implementation would be more verbose and wasteful otherwise: $invalidValues =3D array_filter($inputValues, fn ($value) =3D> !ExampleEnum= ::tryFrom($value)); The proposal is to add the values getter to backed enums: interface BackedEnum extends UnitEnum { public static values(): array; } $enumValues =3D ExampleEnum::values(); Indeed, it's possible to implement this userland in a trait reused across e= nums. However, the implementation in C will be substantially more performant. For instance, the values() method call can resolve to a constant! An alternative syntax is a pseudo-constant, for example, ExampleEnum::value= s. Unlike the constant, the method would be part of the interface complementin= g cases(). Method cases() itself is not a constant only because it returns instances. I'm fine with either syntax leaning towards the method for consistency. Please let me know your thoughts. With enough support, I'd be happy to submit an RFC and implement it myself. Some guidance on the performance optimization aspect may be necessary thoug= h. I'm still missing the karma necessary to create RFCs in the wiki. Regards, Sergii Shymko --_000_PH8PR10MB63372F72B718DF413DBA13C0BFD89PH8PR10MB6337namp_--