On 10 Mar 2025, at 20:07, 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

Hi Daniel,

To begin, I'm all for a `never` bottom type, and I use it regularly when I need 
to write TypeScript.

However, I think the example offered in this RFC – while a valid one, for now – 
isn't the most appropriate use case for a `never` type. A bottom type is more 
often used when defining conditional types, or to assert that the default for a 
switch/match expression should never be reached without raising an error that 
the switch/match cases are not exhaustive.

As such, a `never` type provides a lot of value for static analysis tools and 
IDEs, and as a matter of fact both PHPStan[1] and PhpStorm[2] provide ways to 
declare a bottom type. Furthermore, when conditional return types and/or 
generics are finally implemented in PHP, never will become even more valuable 
if not essential.

But, when generics eventually do make their way to PHP, it also means the 
provided example no longer applies, because you would just be able to use 
generic types:

```php
interface BackedEnum<T> extends UnitEnum {
  public T $value;
 
  public static function from(T $value): static;
  public static function tryFrom(T $value): ?static;
}
```

So I think it may help sell your RFC if you provide some additional context 
illustrating the use of the `never` type in generics and static analysis. 
Otherwise I fear that some people may interpret `never` as a stopgap solution 
until we get generics.

Alwin


[1] https://phpstan.org/writing-php-code/phpdoc-types#bottom-type
[2] 
https://github.com/JetBrains/phpstorm-attributes/blob/master/README.md#noreturn

Reply via email to