Hey Daniel,

I'm currently planning to vote "no" on this.


The reason is that I see this RFC as very narrowly scoped on constructors /
named constructors, and only in the case where a concrete class is
referenced by a consumer.
Constructors/named constructors are effectively not part of an object's
signature, but are rather functions attached to a namespace.


One could argue that `BackedEnum::from()` and `BackedEnum::tryFrom()`
should never have been interfaced anyway: a consumer relies on the concrete
class here anyway.


At the moment, I don't see how a `never` parameter would be used on an
instance method.


I also disagree with the "Userland example" section (`CommonMark`) where
narrower parameter types would be used on concrete implementations of an
interface, hence breaking LSP anyway, if one refers to the parent type in
their code.
The current `CommonMark` "add a runtime assertion" approach is IMO
sufficient, and this RFC doesn't seem to improve the situation, effectively
swapping an assertion failure with a `TypeError`.
An example involving PHPStan and Psalm (and showing a sound implementation
with generic types) would go a long way.
Something that shows how to efficiently use `never` on an instance method,
and have the entire thing type-check in PHPStan / Psalm would really help:
perhaps even the `CommonMark` bit.



Marco Pivetta

https://mastodon.social/@ocramius

https://ocramius.github.io/


On Mon, 21 Apr 2025 at 22:16, Daniel Scherzer <daniel.e.scher...@gmail.com>
wrote:

> Hi internals,
>
> I have opened the vote on https://wiki.php.net/rfc/never-parameters-v2.
> The vote will run for 2 weeks (and a few hours), closing on May 5th at the
> end of the day (UTC).
>
> --Daniel
>

Reply via email to