Het Seifeddine,
On 05.07.26 03:25, Seifeddine Gmati wrote:
Hi Nick,
Thanks for the feedback.
> 1) if I did not miss anything the empty string case is not covered.
> Would `""` be legal? Any thoughts on providing ways to explicitly
> disallow empty strings? I don't think this should be further scope --
> because we would need to make sure that we actually have a usable syntax
> to disallow empty strings.
Empty strings are supported; "" is a valid literal string type.
Regarding non-empty-string, that is a separate concept from literal
types. However, this RFC provides the building blocks to express it in
the future, through negated types (e.g., !""). There's also the option
of doing refinement markers on base types (e.g., string[1..]), which
IIRC Gina is working on or mentioned it somewhere.
Example ( using literal types, negated types, and type aliases ):
```php
type NonEmptyString = ! "";
function getNonEmptyString(): NonEmptyString {
return 'ok'; // ok
return ''; // err
}
```
Sounds good, thanks. Would be great if this would be spelled out in the RFC.
> 2) having strict and non-strict mode in PHP is bad enough, IMO. Seeing
> this brought further, and combined with "literal" (literal should be
> literal) feels wrong -- a coerced `true` is de facto not a literal 1,
> it's a coerced `true`. I understand that you recommend strict and want
> to leave it to a vote, but I feel like the "Coercive matching
> (alternative)" section should make a stronger point against it, to
> discourage a tempting "always been like that" for a new concept.
The RFC highlights that strict matching is already the established
behavior for existing value-types in PHP, and is the preferred path.
true, false, and null never coerce, even in coercive mode. Maintaining
this for all literal types is the only way to ensure a consistent type
system where a unit type matches exactly its identity, hence it is the
preferred option.
I believe we speak past each other here. With you that it should be
strict matching, which you also prefer! I am just asking to make the
"Coercive matching (alternative)" section more explicitly spell out why
it isn't a good choice. As in: literal types would be a new feature for
PHP, why would we apply and carry over lose semantics to something
that's called "literal"? Not sure if I express myself good enough here,
get what I mean? In short: make a stronger point for strict!
> 3) the performance section is thin; solely addressing what Tim brought
> up. I am wondering, does introducing this have any implications for
> non-literal types? Having a benchmark would be nice. I also agree with
> Jorg, that a benchmark comparing the performance with enums (memory +
> speed) would be helpful.
This proposal has no performance impact on non-literal type checks.
Comparing it to enums isn't quite apples-to-apples; enums are objects
and follow standard object comparison logic, whereas these are scalar
identity checks.
Maybe a benchmark would make a strong point for your proposal? Maybe
better performance? Likely mess memory usage?
> 4) the last part of the previous point extends to the general usefulness
> of the feature. I again have to agree with Jorg: it is not clear what
> problem it is trying to solve. Why not enums? It is a trend to get rid
> of stringy APIs, and magic strings and ints -- for reasons. But this
> feature will encourage bringing them back. With an enum you define it in
> one place (easier to refactor), with literal scalar types you repeat it
> in multiple places. Do we really want that?
The core goal is to expand the type system to allow for more precise
descriptions of data. While literal types can be used standalone, they
are fundamental for future features like array shapes, where keys and
values often need to be narrowed to specific literals (e.g., a status
key being exactly 'ok' | 'error'). A richer type system, similar to
what we see in TypeScript, requires literals as a foundational
building block.
Example ( using literal types, type aliases, array shapes, and integer
ranges ):
```php
type ActionResponse = ['status' => 'ok' | 'error', 'message' =>
string, ?'data' => array];
interface Action {
public function perform(Context $ctx, Request $request): ActionResponse;
}
type PingActionResponse = ['status' => 'ok', 'message' => 'pong',
'data' => ['time' => 0..]];
final readonly class PingAction extends Action {
public function perform(Context $ctx, Request $request):
PingActionResponse {
return ['status' => 'ok', 'message' => 'pong', 'data' => ['time'
=> get_time()]];
}
}
```
Well, I believe you know my opinion here, and that we have fundamentally
different ones -- which is fine. Before we bake anything more types into
the language we should standardise PHPDoc, make an official spec. We got
so many things wrong over the recent years that it would be the more
sensible approach. And then the question remains, should we even inline
types? Or is PHPDoc just great with some improvements and official
acknowledgement?
Not sure if potential future language features, that might never come,
are a good selling point that make an argument for getting literal types
in now.
RE type aliases specifically... Something like: "we need to inline types
to have them right where they are used, but then we want to have type
aliases to move them away elsewhere right after" does make zero sense to
me. How does both fit in the very same argument?
Some years ago I wrote the following somewhere (a "thing" refers to an
"object"):
This is one of the reasons I don’t like TypeScript. They put type
definitions everywhere.
My thinking:
An email is a thing. By having that thing we can describe it, with a
type. In real life, something that doesn’t exist, can’t have a type.
So why would we do it differently in programming?
A dedicated file/class for each thing is imho better. Eventually, the
thing is the type by itself. Because if you need the type, you need
the thing.
What would be cool, is to have a type standard library so that not
everyone must write it on their own.
Just TypeScript having all these things doesn't mean that they are good
for PHP. We should not make PHP another TypeScript.
Cheers,
Seifeddine.
--
Cheers
Nick