Re: First-class types RFC

From: Date: Sat, 09 Nov 2024 12:33:22 +0000
Subject: Re: First-class types RFC
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-125932@lists.php.net to get a copy of this message
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]

« previous php.internals (#125932) next »