Re: [Discussion] Revisiting typed closures
| From: | Seifeddine Gmati | Date: | Wed, 01 Jul 2026 19:09:53 +0000 |
| Subject: | Re: [Discussion] Revisiting typed closures | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-131671@lists.php.net to get a copy of this message | ||
On Wed, 1 Jul 2026 at 15:43, Matheus Martins <mathrm@gmail.com> wrote:
>
> Hello internals,
>
> I would like to revisit the idea of giving closures a typed call signature.
>
> e.g. Closure(int, string): array -- enforced at the point a value crosses a
> type boundary (an argument, a return, a property), the same places any other
> type is checked.
>
> Today a closure can only be typed as Closure or callable, neither of which
> says anything about its parameters or return, even though that information is
> right there.
>
> I know this is not new ground: Callable Prototypes was declined in 2016, and
> Garfield and Grekas shared two further RFCs in 2023 -- Structural Typing for
> Closures, and Allow Closures to Declare Interfaces they Implement -- both still
> in draft.
>
> Before taking it further, I would like to know whether closure typing
> is still considered worth pursuing -- or whether the topic is now regarded as
> settled.
>
> References:
>
> - https://wiki.php.net/rfc/callable-types
> - https://wiki.php.net/rfc/structural-typing-for-closures
> -
> https://wiki.php.net/rfc/allow-closures-to-declare-interfaces-they-implement
>
> Thanks.
Hi Matheus,
I'm in favor of adding this. However, syntax wise, i would rather we
re-use the
fn keyword, e.g:
- fn(int): string
- fn(string, int=): string (= indicates the parameter is optional)
- fn(...string): string (... indicates the parameter is variadic)
- fn(&string): void (& indicates the parameter is by-reference)
I also think restricting this to allow only Closure instance inputs
is the right approach ( given that we have FCC ), as i think type
checking array callables, and strings would be annoying and probably
wasteful.
Cheers,
Seifeddine.