On 9 November 2024 08:39:57 GMT, Adam Kecskes <kecskes.adam@outlook.com> wrote:
I propose adding first-class types to PHP, as this feature could greatly enhance the language, especially given PHP's unique runtime type-checking system. Many libraries currently rely on class strings as function parameters, which could be made significantly safer with native types rather than strings.
Hi Adam,
I think this is an interesting idea to think about, although I have no idea what the implementation might look like.
One of the things I've been thinking about for some time is how to improve PHP's type casting functionality, and a key sticking point is a sufficiently flexible syntax. Not wanting to get into the casting itself, let's imagine we want to add "foo casts", available for all types, including unions, nullable types, etc; options seem to be:
- foo_cast("int|string", $value) - a "stringly typed" function with no new syntax; flexible, but ugly and awkward to statically analyse
- foo_cast($value as int|string) - a new keyword for each type of cast; expressive, but a high barrier to adding more casting options
- foo_cast<int|string>($value) - if we add generics, even without type inference, that syntax could be used to "specialise" by type
- foo_cast(int|string, $value) - passing the type as a parameter would read very nicely
There's a lot of overlap between the last two, but also some differences:
- generics give a clear way of expressing that the function will return the given type, or perhaps some manipulation of it, like "function foo_cast<T>(mixed $value): T|CastError"
- first-class types, on the other hand, give a clear way for userland to pass around type specifications, like "function cast_in_turn(mixed $value, type ...$types): array { /* loop over $types, calling foo_cast($type, $value) for each one */ }"
Would first-class types and generics need to be mutually exclusive, to avoid a confusing overlap of functionality? Or could they be made explicitly complementary somehow?
I wonder what prior art there is in this area, in both the theory of type systems, and the practice of language implementations?
Regards,
Rowan Tommins
[IMSoP]