On Mon, Mar 10, 2025 at 12:05 PM Daniel Scherzer <
daniel.e.scher...@gmail.com> wrote:

> Hi internals,
>
> I'd like to start discussion on a new RFC about allowing `never` for
> parameter types when declaring a method.
>
> * RFC: https://wiki.php.net/rfc/never-parameters-v2
> * Implementation: https://github.com/php/php-src/pull/18016
>
> -Daniel
>


Since a lot of the discussion seems to be around static analysis and
whether there is a real use case for this, I wanted to share another use
case I just came across: in the `thephpleague/commonmark` package,
different renderers are added to render different types (subclasses) of
`League\CommonMark\Node\Node`. You can see the interface for renderers at
[1]. The overall interface supports being called with any `Node` type, but
each underlying renderer expects to be called with a *narrower* type than
that. To avoid LSP violations, the renderers

* have a `Node` typehint
* have a documentation comment with the actual subclass of `Node` that they
support
* manually throw an exception on invalid values

See, e.g., the default renderer for paragraphs[2]. This seems like exactly
the place where you would find it useful to have `never` parameters. The
current implementation
* uses comments and static analysis tools to document the restriction
* manually throws an exception when violated

Whereas if the base class had a `never` parameter, it could
* use language typehints to document the restriction
* have the exception enforced automatically

I don't think we should be worried about the fact that, under static
analysis, we don't know what type of value is accepted for a `never`
parameter, because under actual operation, you can always just manually
throw an exception for a type you don't want, like commonmark does.

-Daniel

[1]
https://github.com/thephpleague/commonmark/blob/2.6/src/Renderer/NodeRendererInterface.php
[2]
https://github.com/thephpleague/commonmark/blob/2.6/src/Renderer/Block/ParagraphRenderer.php

Reply via email to