Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:119757 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 20648 invoked from network); 29 Mar 2023 08:31:22 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 29 Mar 2023 08:31:22 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id AC6741804D4 for ; Wed, 29 Mar 2023 01:31:21 -0700 (PDT) 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.6 required=5.0 tests=BAYES_50,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, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.2 X-Spam-ASN: AS15169 209.85.128.0/17 X-Spam-Virus: No X-Envelope-From: Received: from mail-ua1-f42.google.com (mail-ua1-f42.google.com [209.85.222.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Wed, 29 Mar 2023 01:31:21 -0700 (PDT) Received: by mail-ua1-f42.google.com with SMTP id n17so10783234uaj.10 for ; Wed, 29 Mar 2023 01:31:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1680078680; x=1682670680; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=JkddzIn6DAFXASELus2P73uOA8vJMUoG+ZeUOxlVXMo=; b=X07XElVS/9Wl4nwUGHRIn7iBAPwYnUMb0KOgNRbtj2MUWMxVXnpyztpGnMr881jtIc m5r87ee7foVrMXQ1A587Mtt3bJeEpXbabNNMC034J+kA3aF+EhvcuXGSUjZNJtawACMQ WfaJ3j+3Nfii5C1ygc40TJ9iaguPZN8VzLGLMuQGbcCB6x8J2H7XQFgTGQ/NO+ShRvr8 PSVUpnBWoUvVJma7lIkLl4AY6X7t5ypRqhmibQdbvfU4S8Fc5q8eJsy2gQa+K8hF2LhG 46vvtnCzHjOQ82b8JCYXNgU6gsmPEW68MX5ST7Zd+V+OJp+ejjsOa+nPvG2xlgIlz7E0 l7vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680078680; x=1682670680; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=JkddzIn6DAFXASELus2P73uOA8vJMUoG+ZeUOxlVXMo=; b=I1/p8INAdcFEhnn2EdvL6bQYDohttHn268ps+4Sjlz2yyTQPa8cKB3r7cpUvZj1d7t SfXn/doCVcdtmm+bHhpIbi6i+Ji8wPpM/Zuau7McdvwmqKZxUVphH6UMLp/+xZex7b32 byZCdQqq8cjTALCKHbUFPq8kaQdrCbLaOkIAKkUHml6anPB3iR55hka1nV0aiHmK4v4l DSRTlMChbqzuZJ+ezkdvJdb5C8tNzIib58IPLIx6F3mTe8gQJOBgsJgLjRXuc0m4YaUm ygpwIOe0Ovq32yXqfW++JfQSgCa73/vMiJrnw8n8XLO/OgjENlE4Huj2uK9mqiyP5kr8 j5Hg== X-Gm-Message-State: AAQBX9cCmGLo09qfrSAllYeM64TO07oR2Dm0+0Rkk4z0El8DCjhcVRYM 1d20VNhMuZTVMr6D39cLqlwNl99aARDkGXfUm64wc1/SDQU= X-Google-Smtp-Source: AKy350YhaJ6kxW7ES94+XL+B/8LoTk7zO4S0u+spGrjrY5MD1Gc95h0PGMvVs2QjUfd64kHqOT5stA9lnOT/ruk5Vn8= X-Received: by 2002:a1f:ad4b:0:b0:432:90b6:e626 with SMTP id w72-20020a1fad4b000000b0043290b6e626mr10107056vke.3.1680078679763; Wed, 29 Mar 2023 01:31:19 -0700 (PDT) MIME-Version: 1.0 Date: Wed, 29 Mar 2023 11:31:03 +0300 Message-ID: To: internals@lists.php.net Content-Type: text/plain; charset="UTF-8" Subject: [IDEA] allow extending enum From: raveren@gmail.com (=?UTF-8?Q?Rokas_=C5=A0leinius?=) Enums were a very useful addition to PHP, however one aspect of them is neither explicitly documented - or seemingly even talked about. Enums were implemented as final so they cannot be extended nor can extend anything else. From a user perspective it's surprising - and actually limiting. USAGE EXAMPLE: I am making an error management system: each error presented to the user must have a unique code visible. ```php class SystemError { public function __construct( private string $errorText, private ErrorCode $code ) { } public function __toString(): { return $this->errorText . ' ' . $this->code->toString(); } } // ... enum ErrorCode { case Code_1; case Code_2; public function toString(): string { return 'Error code:' . substr($this->name, strlen('Code_')); } } ``` Now I want to modify it to support different modules with different namespaces for errors, e.g. an ApiError, simple enough: ```php enum BaseErrorCode { // ... } enum ErrorCode extends BaseErrorCode { case Code_1; case Code_2; // ... } enum ApiErrorCode extends BaseErrorCode { // ... function toString(): string { return 'Error code:API-' . substr($this->name, strlen('Code_')); } } ``` This results in a syntax error. PROPOSAL: Enums should be able to extend other enums. For a complete wishlist, add: * abstract enums; * enums allowed to implement interfaces; However since I have no experience in PHP source code, I can only provide the test suite for a possible PR this might have :( Do you think this is likely to get implemented?