Re: [RFC] [Discussion] Literal Scalar Types
| From: | Jordi Kroon | Date: | Mon, 15 Jun 2026 12:09:05 +0000 |
| Subject: | Re: [RFC] [Discussion] Literal Scalar Types | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-131270@lists.php.net to get a copy of this message | ||
On 15/06/2026 3:22 am, Seifeddine Gmati wrote:
Hello Internals, I'd like to start the discussion on a new RFC adding literal scalar types to PHP. - RFC: https://wiki.php.net/rfc/literal_scalar_types - Implementation: https://github.com/php/php-src/pull/22314 Thanks, Seifeddine.I mainly see the benefit here as being able to be more strict about what a function actually accepts and returns, in cases where a dedicated enum would be overkill. Two things I'd like to understand better: Does the RFC allow referencing constants in type positions, or only raw literal values?
function foo(STATUS_ACTIVE|STATUS_INACTIVE $sort): void {}
What about enum values? For example:
function bar(Status::Active->value $status): void {}
// or simply as
function bar(Status::Active $status): void {}
Also, I'm not really a fan of mixing literal types with unions.
function foo(int|'bar' $param): void {}
To me, mixing these makes it harder to reason about what a function actually accepts. The whole point of literal types is to be (more) precise but the moment you throw a wide type like int into the union, that precision goes out the window. If a function takes int|'bar', what does that really tell me? It feels like it defeats the purpose.
--
Regards,
Jordi Kroon